0

一直在做一个shell项目。我已经设置了 I/O 重定向,但我显然遗漏了一些东西,因为当使用如下行进行测试时:“ls -al > outfile”它会在我的桌面上创建 outfile,但将其留空并且程序返回以下错误:

ls: >: No such file or directory
Error: Failure to wait for child.
: Interrupted system call

这是我的代码:

        pid_t child = fork();


        if (child < 0)
        {
            perror( "Error: Fork failure.\n" );
            exit(1);
        }

        else if (child == 0)
        {

            //If < file (read)
            if (inpt)
            {
                int fd_in = open(argumnts[index+1], O_RDONLY, 0);
                dup2(fd_in, STDIN_FILENO);
                close(fd_in);
                inpt = 0;
            }

            //If > file (create or truncate)
            if (outpt)
            {
                int fd_out_A = open(argumnts[index+1], O_CREAT | O_TRUNC, 0666); 
                dup2(fd_out_A, STDOUT_FILENO);
                close(fd_out_A);
                outpt = 0;
            }


            execvp (argumnts[0], argumnts);

            perror(command);
            exit(0);
        }
        else
        {
            inpt = 0;
            outpt = 0;
            outptApp = 0;

            if ( waitpid(child, 0, WUNTRACED) < 0 )
                perror( "Error: Failure to wait for child.\n" );
        }
    }

} //End While(1) loop

比较器函数只是检查输入的命令参数是“<”、“>”还是“>>”,然后返回包含它的索引。

不确定我在这里缺少什么,但它会返回前面提到的错误。任何想法?

4

1 回答 1

3

有两件不同的事情正在发生。

  1. ls: >: No such file or directory可以通过argumnts[index]=NULL调用前设置来修复execvpls将其> outputfile视为应列出的附加文件名。NULL终止参数列表将解决这个问题。

  2. Error: Failure to wait for child. : Interrupted system call: 等待时发生了一些事情。中断的系统调用 ( EINTR) 通常不是问题,并且可以重新启动而不会产生不良影响。我在这里找到了以下建议来替换单个调用waitpid

“一个典型的代码序列是:

   while((pid = waitpid(,,)) == -1) {

       switch (errno) {

       case EINTR: continue;

       default: printf(stderr, ...)

               break;

       }}

   ... rest of normal waitpid-hanling goes here ...

此外,您可能必须至少为 SIGCHLD 安装信号处理程序。"

另外,我注意到您没有重定向 stderr,这可能会导致父子之间的交互。另一个问题 - 你是否按下了 control-C?如果是这样,请参见此处

此外,WUNTRACED可能是也可能不是您要指定的内容,具体取决于您是否正在处理终端信号。请参阅 waitpid(2) 的手册页,例如,此处。也许0,或者WEXITED

于 2013-10-23T17:53:37.573 回答