使用C

时间:2017-10-30 22:21:22

标签: c fork exec file-descriptor piping

我已经尝试在我的代码中实现管道,它接受字符串,将它分成几个命令(结果 - 参数),执行(execvp)和使用管道写/读结果,但我在最后一步卡住了。 / p>

为了解决这个问题,我尝试过使用for循环  1.第一个元素写道,  2.中间读/写,  3.最后一个读。

我尝试过使用2对读/写文件描述符来解决它。

代码编译,但不起作用。我的猜测是我正在使用close和文件描述符不正确。

功能:

int exec_multi(char*** args, int count)
{
    int pipefd1[2];
    int pipefd2[2];
    int pid;
    int i;
    char ** arguments;
    for (i = 0; i < count; i++)
    {
       arguments = args[i];
       if (i==0)
       {
          printf("Write %i\n", i);
          if (pipe(pipefd1) == -1) {
            perror("Shell: Piping error\n");
            exit(1);
          }

          if ((pid = fork()) == -1) {
            perror("Shell: Forking error\n");
            exit(1);
          } else if (pid == 0) {
            printf("first shit\n");
            dup2(pipefd1[1], STDOUT_FILENO);
            close(pipefd1[0]);
            close(pipefd1[1]);
            execvp(arguments[0], arguments);
            perror("Shell: Executing error\n");
            _exit(1);
          }
       }
       else if (i==(count-1))
       {
           printf("Read %i\n", i);
            if ((pid = fork()) == -1) {
                perror("Shell: Forking error\n");
                exit(1);
            } else if (pid == 0) {
                printf("last sh\n");
                dup2(pipefd1[0], STDIN_FILENO);
                close(pipefd1[0]);
                close(pipefd1[1]);
                execvp(arguments[0], arguments);
                perror("Shell: Executing error\n");
                _exit(1);
            }
       }
       else
       {
           printf("Read & write %i\n", i);
            if (pipe(pipefd2) == -1)
            {
                perror("Shell: Piping error\n");
                exit(1);
            }
            if ((pid = fork()) == -1) {
                perror("Shell: Forking error\n");
                exit(1);
            } else if (pid == 0) {
                dup2(pipefd1[0], STDIN_FILENO);
                dup2(pipefd2[1], STDOUT_FILENO);
                close(pipefd1[0]);
                close(pipefd1[1]);
                pipefd1[0] = pipefd2[0];
                pipefd1[1] = pipefd2[1];
                close(pipefd2[0]);
                close(pipefd2[1]);
                execvp(arguments[0], arguments);
                perror("Shell: Executing error\n");
                _exit(1);
            }
       }
    }

    return 1;
}

0 个答案:

没有答案