[英]Wrong file descriptor while redirecting output of a comand to file
我正在尝试对invoke函数进行编码,以在我的伪Shell中进行调用,但是尽管简单的(一个命令)和管道情况可以正常工作,但是当我尝试重定向时,却给了我一个写错误,即文件描述符错误。 argv []包含第一个命令的名称和参数,而argv []包含第二个命令的名称和参数;
int invoke(char *argv1[], char *argv2[], type_c tipo)
{
int pid, pfd[2], fid;
switch(tipo)
{
case(_SIMPLE):
pid=fork();
switch(pid) {
case 0:
execvp(argv1[0],argv1);
}
break;
case(_PIPE):
pipe(pfd);
pid=fork();
switch(pid) {
case 0:
close(1);
dup(pfd[1]);
close(pfd[0]);
close(pfd[1]);
execvp(argv1[0],argv1);
}
pid=fork();
switch(pid) {
case 0:
close(0);
dup(pfd[0]);
close(pfd[0]);
close(pfd[1]);
execvp(argv2[0],argv2);
}
close(pfd[0]);
close(pfd[1]);
break;
case(_REDIRECT):
pid=fork();
switch(pid) {
case 0:
close(fileno(stdout));
fid=open(argv2[0],O_CREAT|O_WRONLY);
dup(fid);
close(fid);
execvp(argv1[0],argv1);
}
break;
}
return pid;
}
为了测试它,在main()函数中,我编写了以下代码:
char *argv[2][3];
argv[0][0]="ls";
argv[0][1]="-l";
argv[0][2]=NULL;
argv[1][0]="test";
argv[1][1]=NULL;
pid=invoke(argv[0],argv[1],_REDIRECT);
那我该怎么办? :/ thanx提前
如果是_REDIRECT
,
1
。 file
。 这直接在描述符编号1
上打开。 dup
这个新的文件描述符,它将在描述符3
上打开相同的文件( 2
代表stderror
)。 1
上的fid
。 然后, ls
程序尝试打印到fd 1
,在这种情况下该bad-file descriptor.
已经关闭,因此使其成为bad-file descriptor.
有两种解决方法。
不需要额外的dup
,您的代码可以完美运行。
close(fileno(stdout));
int fid=open(argv2[0],O_CREAT|O_WRONLY);
execvp(argv1[0],argv1);
为了使我们的生活更轻松,还有另一个函数dup2
,该函数隐式关闭target fd
并将其复制为fd
。
int fid=open(argv2[0],O_CREAT|O_WRONLY);
dup2(fid,1);
close(fid);
execvp(argv1[0],argv1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.