创建一个流程并告诉它睡觉?

时间:2013-02-10 15:16:36

标签: c unix process fork sleep

告诉特定进程睡眠的正确方法是什么? 我不完全理解如何控制我创建的不同进程..

我正在尝试制作两个睡眠时间为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文件。我应该看到它们的简单解释。 。是的,这是学校教材,但不是,这不是作业。

2 个答案:

答案 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 进程:

  1. First fork创建一个新进程,p1在新进程中获得0,在父进程中获得一些pid。
  2. 在原始父级和子级中都调用第二个fork,为图片添加2个进程。 p2在所有“孙子”中获得0,在第2步之前存在2个进程中的两个不同pid。
  3. 四个不同的进程中调用第三个分支,为图片添加了四个其他进程。

答案 1 :(得分:4)

您可以发送SIGSTOP,然后发送SIGCONT我认为。

kill(p1, SIGSTOP);

或者更加理智,因为你只是分叉并因此完全控制代码,你可以处理路径:

if (in_child_1)
    sleep(..);

作为旁注,在您的代码中创建的进程比您预期的要多。事情是p1创建后,从该点开始执行,与其父并行。等等。