gpt4 book ai didi

c - 为什么我的进程没有同时运行?

转载 作者:太空狗 更新时间:2023-10-29 17:24:27 25 4
gpt4 key购买 nike

我的问题是:

1.) 我怎样才能让父进程总是最后死掉?我知道这没有完成,因为父级是第一个运行的 pid,但我不知道如何更改它。

2.) 我如何让我的子进程像他的一样同时执行?我什至把这个数字调高了很多,看看这是否只是巧合,但它似乎不是。

编辑:解决方案

1.) 在内部 Default 中添加了两次 wait(NULL)
2.) 正在发生。用 sleep(1) 来证明。

我的代码如下

#include <stdio.h>
int main() {
int pid, i;
pid = fork();
switch(pid) {
case -1:
// error
printf("Fork error");
break;
case 0:
// child process
printf("First child is born, my pid is %d\n", getpid());
for(i=1; i<10; i++)
printf("First child executes iteration %d\n", i);
printf("First child dies quietly.\n");
break;
default:
// parent process
printf("Parent process is born, my pid is %d\n", getpid());
pid = fork();
switch(pid) {
case -1:
// error
printf("Fork error");
break;
case 0:
// child process
printf("Second child is born, my pid is %d\n", getpid());
for(i=1; i<10; i++)
printf("Second child executes iteration %d\n", i);
printf("Second child dies quietly.\n");
break;
default:
// parent process
printf("Parent process dies quietly.");
}
}
return 0;
}

我的输出总是这样的:

Parent process is born, my pid is 7847  First child is born, my pid is 7848  First child executes iteration: 1  First child executes iteration: 2  First child executes iteration: 3  First child executes iteration: 4  First child executes iteration: 5  First child executes iteration: 6  First child executes iteration: 7  First child executes iteration: 8  First child executes iteration: 9  First child executes iteration: 10  First child dies quietly.  Parent process dies quietly.  Second child is born, my pid is 7849  Second child executes iteration 1  Second child executes iteration 2  Second child executes iteration 3  Second child executes iteration 4  Second child executes iteration 5  Second child executes iteration 6  Second child executes iteration 7  Second child executes iteration 8  Second child executes iteration 9  Second child executes iteration 10  Second child dies quietly.  

我的任务是:

编写一个创建三个进程的 C 程序(“procs.c”):一个创建两个子进程的父进程。

第一个 child 应该做以下事情:

  • 显示“第一个 child 出生,我的pid是……”

  • 显示十次消息“第一个 child 执行迭代 X”,其中 X 是迭代次数

  • 显示“第一个 child 安静地死去。”

第二个 child 应该做到以下几点:

  • 显示“二胎出生,我的pid是……”

  • 显示十次消息“Second child executes iteration X”,其中X是迭代次数

  • 显示“第二个 child 安静地死去。”

父进程应该做以下事情:

  • 显示“父进程诞生,我的pid是……”

  • 创建第一个 child

  • 创建第二个 child

  • 显示“父进程安静地死去。”

使用 gcc 编译程序并将可执行文件命名为“procs”。多次执行程序,注意两个 child 的输出如何交错。

这个程序可能的输出是:

nova> ./procsParent process is born, my pid is 7847  First child is born, my pid is 7848  First child executes iteration: 1  First child executes iteration: 2  First child executes iteration: 3  First child executes iteration: 4  First child executes iteration: 5  Second child is born, my pid is 7849  Second child executes iteration 1  Second child executes iteration 2  Second child executes iteration 3  First child executes iteration: 6  Second child executes iteration 4  Second child executes iteration 5  Second child executes iteration 6  First child executes iteration: 7  Second child executes iteration 7  Second child executes iteration 8  Second child executes iteration 9  Second child executes iteration 10  Second child dies quietly.  First child executes iteration: 8  First child executes iteration: 9  First child executes iteration: 10  First child dies quietly.  Parent process dies quietly.  

最佳答案

  1. 适当的父进程应该等待(使用 wait() or waitpid() 或特定于平台的变体)其子进程在退出前死亡。

  2. 并发执行需要调度程序获得运行的机会。您可以通过适当的 sleep (微 sleep ,nano-sleep)操作强制解决问题。一些系统调用会有所帮助(因此 fflush(0) 可能会有所帮助)。


#include <stdio.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>

int main(void)
{
int pid, i;
struct timespec tw = { .tv_sec = 0, .tv_nsec = 10000000 };
pid = fork();
switch(pid)
{
case -1:
printf("Fork error");
break;
case 0:
printf("First child is born, my pid is %d\n", getpid());
for(i=1; i<10; i++)
{
printf("First child executes iteration %d\n", i);
nanosleep(&tw, 0);
}
printf("First child dies quietly.\n");
break;
default:
printf("Parent process is born, my pid is %d\n", getpid());
pid = fork();
switch(pid)
{
case -1:
printf("Fork error");
break;
case 0:
printf("Second child is born, my pid is %d\n", getpid());
for(i=1; i<10; i++)
{
printf("Second child executes iteration %d\n", i);
nanosleep(&tw, 0);
}
printf("Second child dies quietly.\n");
break;
default:
printf("Parent process waiting for children.\n");
int corpse;
int status;
while ((corpse = waitpid(0, &status, 0)) > 0)
printf("Child %d died with exit status 0x%.4X\n", corpse, status);
printf("Parent process dies quietly.\n");
break;
}
}
return 0;
}

示例输出:

Parent process is born, my pid is 46624
First child is born, my pid is 46625
First child executes iteration 1
Parent process waiting for children.
Second child is born, my pid is 46626
Second child executes iteration 1
First child executes iteration 2
Second child executes iteration 2
First child executes iteration 3
Second child executes iteration 3
First child executes iteration 4
Second child executes iteration 4
Second child executes iteration 5
First child executes iteration 5
Second child executes iteration 6
First child executes iteration 6
Second child executes iteration 7
First child executes iteration 7
Second child executes iteration 8
First child executes iteration 8
Second child executes iteration 9
First child executes iteration 9
First child dies quietly.
Second child dies quietly.
Child 46625 died with exit status 0x0000
Child 46626 died with exit status 0x0000
Parent process dies quietly.

请注意,10 毫秒的延迟几乎强制交替执行。如果没有类似的东西,您将受制于系统及其调度程序的特性,而且许多现代机器实在是太快了!

关于c - 为什么我的进程没有同时运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12312164/

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