gpt4 book ai didi

c - 有没有一种好方法可以改变用 fork() 创建的子进程的执行顺序?

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

我正在寻找创建我可以控制其处理顺序的子进程。

简单的例子:

  • parent 用 fork 创造了 2 个 child
  • children
    1. 第一个 child 打印“消息 2”
    2. 第二个 child 打印“消息 1”
  • 完成后父打印“End”

由于我们无法确定哪个进程将首先执行,因此最终结果很可能是:

Message 2

Message 1

End

我试图确保第二个 child 在第一个 child 之前执行打印,而 parent 在所有 child 之后执行打印。

对于父级来说,使用 wait()/waitpid() 函数非常容易。然而,对于 child 来说似乎更难。

这里是我实现目标的想法的实现:

(注意:我对创建子进程还是很陌生,我可能在这个实现中误解了一些东西)

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

#include <sys/types.h>
#include <signal.h>
#include <unistd.h>

static int init = 0;

void setInitFinished(int sig)
{
if (sig == SIGUSR1)
init = 1;
}

int main()
{
signal(SIGUSR1, setInitFinished);

pid_t pid1, pid2;
int status1, status2;

// CHILD 1
if (!(pid1 = fork()))
{
while (!init); // Waiting all children to be initiated

// Once all children created, we wait for child 2 to print its message
int pidOfChild2 = getpid()+1; // I checked, the PID is correct
waitpid(pidOfChild2, &status1, 0);

printf("MESSAGE 2\n");
exit(0);
}

// CHILD 2
if (!(pid2 = fork()))
{
while (!init); // Waiting all children to be initiated

// No need to wait since it's the first message to be printed
printf("MESSAGE 1\n");
exit(0);
}

// PARENT

// All children have been created, tell it to all the children
kill(pid2,SIGUSR1);
kill(pid1,SIGUSR1);

// When every child has finished its work, continue parent process
waitpid(pid1, &status1, 0);
waitpid(pid2, &status2, 0);

printf("Parent end\n");

return 0;
}

在 child 1 中,我试图用 waitpid(pidOfChild2, ...) 等待 child 2;但它似乎不起作用。

我仍在探索 fork 功能,所以我很确定我误解了这里的很多东西。

注意:我想避免使用 sleep(),它可以工作但不漂亮

最佳答案

您需要使用实际的进程间通信来实现这一点。

您似乎认为 waitpid() 函数与等待进程打印输出有关,但这根本不是它的作用。

创建一个 semaphore在父级中,将其传递给两个子级,并让一个子级在打印前等待信号量,另一个在完成打印后向信号量发送消息。

关于c - 有没有一种好方法可以改变用 fork() 创建的子进程的执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46523164/

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