从C中的管道传递的参数

时间:2011-08-25 10:17:36

标签: c pipe

我试图通过管道和execvp传递令牌......但是我的问题是第1和第2个子进程收到相同的令牌......如果有第三个或更多令牌可以做什么?

    int pipedes[2];
    pipe(pipedes);

    pid_t pid = fork();
    if (pid == 0) {
            dup2(filedes[1], 1);

            execvp(argv[0], argv);
    } else {
            close(pipedes[1]);
    }

    pid = fork();
    if (pid == 0) {
            dup2(pipedes[0], 0);

            execvp(arg[0], argv);
    }

    wait(&pid);

和令牌

strtok(line, "|");

            pipe(line);
            while (1) {

                    line= strtok(NULL, "|");

                    pipe(line);
            }

2 个答案:

答案 0 :(得分:0)

这一行:

pipe(line);

是胡说八道。它创建了两个新的文件描述符,并用它们覆盖2 x sizeof(int)的第一个line字节。您的生产者进程应该将标记写入stdout,并且您的使用者进程应该从stdin读取它们。

顺便说一句,您的子进程似乎执行与具有完全相同参数的父进程相同的可执行文件。每个人如何知道它是生产者还是消费者?

答案 1 :(得分:0)

如果您希望两个不同的子进程执行相同的可执行文件,但使用两个不同的命令,则需要为每个子进程设置两个不同的管道。您设置管道的过程也是错误的,因为您允许孩子打开管道。

#include <sys/wait.h>
#include <unistd.h>
#include <
int pipedes_child_1[2];
int pipedes_child_2[2];

pipe(pipedes_child_1);

pid_t child = fork();

if (!child)
{
    dup2(pipedes_child_1[0], 0);
    close(pipedes_child_1[1]); //without this, child with hang on read()
    execvp(argv[0], argv);
}
else
{
    close(pipedes_child_1[0];
}

pipe(pipedes_child_2);

child = fork();

if (!child)
{
    dup2(pipedes_child_2[0], 0);
    close(pipe_des_child_2[1]);  //without this, child with hang on read()
    execvp(argv[0], argv);
}
else
{
    close(pipedes_child_2[0]);
}

//...write tokens to each child via pipedes_child_X[1];

//wait for all the children
int return_val = 0;
while(wait(&return_val) > 0 || errno != EINTR);

请记住,既然你正在调用execvp(argv[0], argv),那么你实际上是要对进程进行无限递归的“粉丝”,因为你只是用当前的参数回忆起当前的进程......我不知道不要以为这就是你想要的。为了防止这种情况,假设您将子进程指定为主父可执行文件的参数,并将这些值作为要在调用exec函数系列之一时启动的程序传递。例如:

//child_1 executable that will take no arguments and read from the pipe
execlp(argv[1], argv[1], (char*)0);

//child_2 executable that will take no arguments and read from the pipe
execlp(argv[2], argv[2], (char*)0);