gpt4 book ai didi

c - 如何使用运行异步的 fork 创建 3 个进程

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

我有一个问题,我需要编写一个小的 c 程序来打印出由三个进程给出的随机数,这些进程自己只打印一个数字 20 次。

输出应该类似于 0122102021012021120... 以及从父进程完成的内容。

我只得到这样的输出:

00000000000000000000ready11111111111111111111readyready22222222222222222222readyreadyready

而且我不知道该怎么做——我似乎不理解 fork() 系统背后的基本逻辑;)

我的代码是:

  1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4
5 void printfXtimes(int a, int b){
6 int i;
7 for(i=0;i<b;i++){
8 printf("%i",a);
9 sleep(1);
10 }
11 }
12
13 void main(){
14 for(int kid = 0; kid < 3; ++kid) {
15 int pid = fork();
16 if(pid < 0){
17 exit(EXIT_FAILURE);
18 }else if (pid > 0){
19 /* Parent process */
20 printf("ready");
21 }else{
22 /* Child process */
23 printfXtimes(kid,20);
24 exit(EXIT_SUCCESS);
25 }
26 for (int kid = 0; kid < 3; ++kid) {
27 int status;
28 pid_t pid = wait(&status);
29 }
30
31 }
32 }

这里有什么问题吗? :/该任务被认为是“简单的”...我不明白...

最佳答案

适度可行的代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

static void printfXtimes(int a, int b)
{
for (int i = 0; i < b; i++)
{
printf("%i\n", a);
usleep(10000);
//sleep(1);
}
}

int main(void)
{
for (int kid = 0; kid < 3; ++kid)
{
int pid = fork();
if (pid < 0)
{
exit(EXIT_FAILURE);
}
else if (pid > 0)
{
/* Parent process */
printf("PID %d ready\n", pid);
}
else
{
/* Child process */
printfXtimes(kid, 10);
exit(EXIT_SUCCESS);
}
}

for (int kid = 0; kid < 3; ++kid)
{
int status;
int corpse = wait(&status);
printf("PID %d exited 0x%.4X\n", corpse, status);
}
}

注意事项:

  • 使用 fork() 时,main() 的正确返回类型是 int,而不是 void .您可以在 Windows 上使用 void main();在其他任何地方,它都是错误的(几乎所有其他地方——特定系统可以将其记录为 OK,就像 Windows 一样)。参见 What should main() return in C and C++?
  • 一个问题是,在您启动每个 child 之后,您要等待三个 child 死亡。该循环应该在启动循环之后。否则,您将强制执行顺序处理,而不是异步处理。
  • 另一个问题是您不在消息末尾使用换行符;这也会造成混淆(参见 printf() anomaly after fork())。

示例输出(无管道):

PID 34795 ready
PID 34796 ready
0
1
2
PID 34797 ready
0
1
2
0
1
2
0
1
2
0
1
2
0
1
2
1
2
0
1
0
2
1
0
2
1
2
0
PID 34795 exited 0x0000
PID 34797 exited 0x0000
PID 34796 exited 0x0000

示例输出(通过管道传输到 sed):

0
0
0
0
0
0
0
0
0
0
PID 34789 ready
1
1
1
1
1
1
1
1
1
1
PID 34789 ready
PID 34790 ready
2
2
2
2
2
2
2
2
2
2
PID 34789 ready
PID 34790 ready
PID 34791 ready
PID 34789 exited 0x0000
PID 34791 exited 0x0000
PID 34790 exited 0x0000

如果您已经阅读并理解了“fork() 之后的printf() 异常”问题,您应该了解行缓冲和全缓冲,以及输出via sed 应该是可解释的(特别是,为什么有额外的 PID nnnnn ready 消息副本)。

关于c - 如何使用运行异步的 fork 创建 3 个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37424841/

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