2013-02-10 118 views
3

什么是正确的方式来告诉一个特定的过程睡觉? 我不完全理解如何控制我创建的不同过程。我想让两个进程睡眠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 ..对我应该看到它们的一个简单的解释将被赞赏。是的,这是学校教材,但不是,这不是一项任务。

回答

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分支。

在你的榜样,如果所有叉是成功的,你最终过程:

  1. 首先叉创建一个新的进程,p1在新的进程,并在家长的一些PID的收益为0。
  2. 第二个分支在原始父级和子级中都被调用,为图片添加2个进程。 p2在所有“孙子”和两个不同的PID在步骤2
  3. 第三叉被称为在不同过程之前存在2个进程得0,添加其他四个过程的图片。
+0

哦!我现在明白了,谢谢! – Sti 2013-02-10 15:34:27

4

你可以发送一个SIGSTOP,然后SIGCONT我想。

kill(p1, SIGSTOP); 

或者多三立,因为你只分叉,因此具有完全控制研究过的代码,你可以处理的路径:

if (in_child_1) 
    sleep(..); 

作为一个方面说明,在您的代码会创建比您预期更多的进程。一旦创建了p1从该点开始执行,与其父母并行执行。等等。

+0

因此,当其他子进程工作时,不能让子进程“睡(i)”?是的,我之前注意到他们正在以指数方式来到我身边,为什么呢?我想我必须在叉子上阅读。 – Sti 2013-02-10 15:24:54

相关问题