告诉特定进程睡眠的正确方法是什么? 我不完全理解如何控制我创建的不同进程..
我正在尝试制作两个睡眠时间为2秒和3秒的进程。当进程1已经睡眠2秒,并且进程2仍处于休眠状态时,我希望进程3开始睡眠。但是我怎么告诉一个进程睡觉呢?或者不是吗?
int main(void)
{
pid_t p1 = fork();
pid_t p2 = fork();
pid_t p3 = fork();
//make p1 sleep(2) and p2 sleep(3)
waitpid(p1, NULL, 0); //waiting for p1 to terminate
//make p3 sleep(2);
}
正如您所看到的,我不了解如何处理流程或它们到底是什么。我有点把它们视为对象,但我猜这是错的..我已经尝试过读一些关于它的东西了,但是它们都是9000多页的PDF文件。我应该看到它们的简单解释。 。是的,这是学校教材,但不是,这不是作业。
答案 0 :(得分:5)
从man fork
开始,略短于9000页。主要的是成功的fork
返回两次:它返回0到子进程,子节点的PID返回父进程。它通常像这样使用:
pid_t pid = fork();
if (pid<0) { /* error while forking */
};
if (!pid) { /* code for child */
play();
whine();
sleep();
exit(0);
} else { /* code for parent */
grunt();
waitpid(...);
}
您通常告诉子进程执行此操作,并且只需将代码添加到相应的if
分支。
在您的示例中,如果所有分叉都成功,您最终会得到 8 进程:
p1
在新进程中获得0,在父进程中获得一些pid。p2
在所有“孙子”中获得0,在第2步之前存在2个进程中的两个不同pid。答案 1 :(得分:4)
您可以发送SIGSTOP
,然后发送SIGCONT
我认为。
kill(p1, SIGSTOP);
或者更加理智,因为你只是分叉并因此完全控制代码,你可以处理路径:
if (in_child_1)
sleep(..);
作为旁注,在您的代码中创建的进程比您预期的要多。事情是p1
创建后,从该点开始执行,与其父并行。等等。