gpt4 book ai didi

c - 使用 fork() 的二叉进程树

转载 作者:行者123 更新时间:2023-12-02 03:15:20 26 4
gpt4 key购买 nike

我的操作系统类的第一个项目是使用 fork() 创建一个进程树,其深度由用户在命令行指定。每个叶级节点需要对数据进行排序并使用命名管道 (FIFO) 将其传回其父级。

我可以使用fork()创建一个N深度的树,每个进程有2个子进程。我不明白的是如何将 FIFO 传递给树中的每个子进程,然后让这个进程对 FIFO 中的某些数据进行排序然后 还将其传递回到树的顶部。

这是迄今为止我构建树的伪代码:

void CreateTree(int level)
{
if level = 0 return

int left_child = fork();
if(left_child != 0) //we are the parent
{
int right_child = fork();
if(right_child == 0)
CreateTree(level - 1);
}
else
{
CreateTree(level-1);
}
}

那么我如何单独获取每个进程来使用它们?

最佳答案

您提到了 fifo,又名命名管道,所以我们来看看。 (这里的代码假设 *nix):

这个简单的示例展示了从父级向子级发送数据,让子级操作它,然后将其返回给父级。因此,您不是“传递”fifo,而是每个进程(或子进程)都可以访问 char *,这为它们提供了 fifo 的名称,以便它们可以打开它进行读取或写入因为他们需要。您可以采用这个概念并对您拥有的每个子节点进行扩展:

int main()
{
int fd, n, ret;
fd_set rfds;
char * myfifo = "/tmp/myfifo";

mkfifo(myfifo, 0666); // Create this buffer

if(fork()) //Kid code
{
char kid_buffer[4] = {0};
char temp;

fd = open(myfifo, O_RDONLY); //Open the fifo for reading
n = read(fd, kid_buffer, 4);

printf("Kid %d read %d bytes, parent gave us %s\n",getpid(), n, kid_buffer);
fflush(stdout);
close(fd);

// "sort" the data the parent gave us
temp = kid_buffer[0];
kid_buffer[0] = kid_buffer[1];
kid_buffer[1] = kid_buffer[2];
kid_buffer[2] = temp;
kid_buffer[3] = '\0';
printf("Kid %d reoriginized the list %s\n",getpid(), kid_buffer);
fflush(stdout);

// send the data back
fd = open(myfifo, O_WRONLY);
write(fd, kid_buffer, strlen(kid_buffer));
close(fd);
return 0;
}
else
{
char arr[] = "abc";

//Open the fifo for writing
fd = open(myfifo, O_WRONLY);
write(fd, arr, strlen(arr)); //Sent my data to kid
printf("Parent process %d, just sent my data %s to the kid\n", getpid(), arr);
fflush(stdout);
close(fd);

//Open the fifo for reading
fd = open(myfifo, O_RDONLY);
n = read(fd, arr, 4);

// show the data we got back
printf("Parent %d read %d bytes, kid gave us back %s\n",getpid(), n, arr);
fflush(stdout);
close(fd);
}

unlink(myfifo);

return 0;
}

因此,从此处的输出中,您可以看到父级创建了自己的数组“abc”,并且子级将其修改(通过 FIFO 传递)为“bca”,现在它返回到父级并进行了格式化。

mike@linux-4puc:~> ./a.out 
Parent process 4295, just sent my data abc to the kid
Kid 4294 read 3 bytes, parent gave us abc
Kid 4294 reoriginized the list bca
Parent 4295 read 3 bytes, kid gave us back bca

关于c - 使用 fork() 的二叉进程树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13036278/

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