C Unix - fork(),execl()和循环中的管道

时间:2013-02-21 05:48:18

标签: c unix exec fork pipe

我想在此之前提到我在使用pipes方面没有受过正规教育这一事实,所以这是我的第一次冒险。更不用说我无法找到与我的情况类似的问题。

注意:这是一个更大的学校作业项目的一部分,所以我不是要求任何人为我这样做。我想要一些方向/有用的代码段。 (我试图尽可能地将其作为通用的,以避免"骗子"备注。)

我正在尝试运行for-loopint k个元素,其中父进程会生成kfork()execl()个孩子,然后使用一个pipe()将输出发送回父级。这是我尝试使用的一些通用代码以及我遇到的错误/问题:

注意:helloworld =使用GCC编译的可执行文件生成printf("hello world\n");

int k = 10; //The number of children to make
int fd[2]; //Used for each pipe
int readFromMe[k]; //Holds the file IDs of each pipe fd[0]
int writeToMe[k]; //Holds the file IDs of each pipe fd[1]
int processID[k]; //Holds the list of child process IDs

//Create children
int i;
for(i = 0; i < k; i++)
{
    if(pipe(fd) == -1)
    {
        printf("Error - Pipe error.\n");
        exit(EXIT_FAILURE);
    }

    //Store the pipe ID
    readFromMe[i] = fd[0];
    writeToMe[i] = fd[1];

    if((processID[i] = fork()) == -1)
    {
        fprintf(stderr, "fork failure");
        exit(EXIT_FAILURE);
    }

    //If it is a child, change the STDOUT to the pipe-write file descriptor, and exec
    if(processID[i] == 0)
    {
        dup2 (writeToMe[i], STDOUT_FILENO);
        close(readFromMe[i]);

        execl("./helloworld", (char *)0);
    }

    //If it is the parent, just close the unnecessary pipe-write descriptor and continue itterating
    else
    {
        close(writeToMe[i]);
    }
}

//Buffer for output
char output[100000];

//Read from each pipe and print out the result  
for(i = 0; i < k; i++)
{
    int r = read(readFromMe[i], &output, (sizeof(char) * 100000));

    if(r > 0)
    {
        printf("result = %s\n", output);
    }

    close(readFromMe[i]);
}   

我的程序根本没有输出,所以我想弄清楚为什么会出现这个问题。

2 个答案:

答案 0 :(得分:1)

可能不相关,但您致电execl错误。程序之后的额外参数是argv数组到其他程序main的功能。如你所知,它总是有一个条目,程序名称。所以你需要这样称呼它:

execl("./helloworld", "helloworld", NULL);

与您的问题有关,您还应检查错误,它可能实际上失败。

答案 1 :(得分:1)

尝试在打印输出功能中打印'r'的值。我怀疑读取是否返回了您没有看到的错误(可能是EPIPE)。此外,您的示例代码正在尝试printf'c',而不是像您看起来那样输出。