繁体   English   中英

将命令输出重定向到文件时文件描述符错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM