gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:58:17 25 4
gpt4 key购买 nike

我想先说明一个事实,即我没有接受过使用pipes 的正规教育,所以这是我的第一次尝试。更不用说我找不到任何与我的情况类似的问题。

注意:这是一个更大的学校作业项目的一部分,所以我不要求任何人为我做这件事。我只想要一些指导/有用的代码段。 (我尽量使它尽可能通用,以避免出现“骗子”言论。)

我正在尝试在 int k 元素上运行 for-loop ,其中父进程产生 k 带有 的子进程fork()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]);
}

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

最佳答案

可能不相关,但你调用了 execl 错误。程序后的额外参数是将 argv 数组传递给其他程序的 main 函数。如您所知,它始终有一个条目,即程序名称。所以你需要这样调用它:

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

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

关于C Unix - 循环中的 fork()、execl() 和管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14995428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com