C - 使用dup / fork / exec / wait创建IPC通道

时间:2015-02-24 04:33:40

标签: c ipc

我正在创建一个可以处理单个管道的简单shell。我有一些问题让我的文件描述符在这里工作。

        int child_process_status;
        int fds[2];
        pid_t cpid1, cpid2;

        pipe( fds );

        if ( (cpid1 = fork()) == 0 ) {
            close(1); /* close normal stdout */
            dup( fds[1] ); /* make stdout same as fds[1] */
            close( fds[0] ); /* we don’t need this */

            fnd1 = find_fullpath( fullpath1, &p_cmd_array[0] );

            if ( fnd1 ) {
                if ( (cpid1 = fork()) == 0 ) {
                    execv( fullpath1, p_cmd_array[0].argv );
                }
            } else {
                printf("Command \"%s\" found.\n", p_cmd_array[0].name);
                return 1;
            }
        }

        if ( (cpid2 = fork()) == 0 ) {
            close(0); /* close normal stdin */
            dup( fds[0] ); /* make stdin same as fds[0] */
            close( fds[1] ); /* we don’t need this */

            fnd2 = find_fullpath( fullpath2, &p_cmd_array[1] );

            if ( fnd2 ) {
                if ( (cpid2 = fork()) == 0 ) {
                    execv( fullpath2, p_cmd_array[1].argv );
                }
            } else {
                printf("Command \"%s\" found.\n", p_cmd_array[1].name);
                return 1;
            }
        }

        close( fds[0] );
        close( fds[1] );

        waitpid( cpid1, &child_process_status, 0 );
        waitpid( cpid2, &child_process_status, 0 );

正如你所看到的,除了fork / exec / wait发生的部分外,我已经抽象出来了。其他一切都很好,因此超出了这个范围。我正在关注这个我处理文件描述符的方式,因为我认为我的问题就在于此。

例如,我输入的内容如下:ls -ln | wc -l我得到wc: stdin: read: Bad file descriptor,之后就会挂起。

非常感谢任何帮助。

0 个答案:

没有答案