gpt4 book ai didi

C fork和pipe按顺序打印pid

转载 作者:行者123 更新时间:2023-11-30 19:10:31 25 4
gpt4 key购买 nike

所以我需要这个程序,它需要使用 fork() 创建 argv[1] 子级,并按创建顺序打印它们的子级编号以及它们的 PID。

我必须使用管道阻塞属性来做到这一点。

示例输出:

我是 child 1,我的 PID 是 25853。

我是 child 2,我的 PID 是 25854。

我是 child 3,我的 PID 是 25855。

这是我到目前为止所尝试过的,但它不尊重子级创建的顺序。

int main(int argc, char* argv[])
{
char buffer[80];
int p[2], i;
int pid = getpid();
for (i = 0; i < atoi(argv[1]); i++) {
pipe(p);
if (fork() == 0) {
read(p[0], &pid, sizeof(pid)); // It should block here until there's
// something in the pipe to read
sprintf(buffer, "I am child %d and my PID is %d\n", i + 1, getpid());
write(1, &buffer, strlen(buffer));
close(p[0]);
close(p[1]);
exit(0);
}
else { // parent
close(p[0]);
write(p[1], &pid, sizeof(pid));
close(p[1]); // The child is able to read the EOF now.
}
}
while ((waitpid(-1, NULL, 0)) > 0)
;
close(p[0]);
close(p[1]);
sprintf(buffer, "I've finished\n");
write(1, &buffer, strlen(buffer));
}

我觉得我很接近,但我没有正确使用管道 block poperties。我需要一些建议,谢谢。

最佳答案

#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
if (argc != 2) {
return 1;
}
int const n = atoi(argv[1]);
for (int i = 0; i < n; i++) {
int p[2];
if (pipe(p) != 0)
return 1;
int pid = fork();
if (pid == 0) {
close(p[1]);
if (read(p[0], &pid, sizeof pid) != sizeof pid)
return 1;
close(p[0]);
fprintf(stdout, "I am child %d and my PID is %d\n", i + 1, pid);
return 0;
}
else if (pid > 0) {
close(p[0]);
if (write(p[1], &pid, sizeof pid) != sizeof pid)
return 1;
close(p[1]);
if (waitpid(pid, NULL, 0) == -1)
return 1;
}
else {
return 1;
}
}

fprintf(stdout, "I've finished\n");
}

关于C fork和pipe按顺序打印pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41129739/

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