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 的.. 对我应该看到它们的简单解释将不胜感激. 是的,这是学校教材,但不,这不是作业。

4

2 回答 2

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. 首先 fork 创建一个新进程,p1在新进程中获取 0,在父进程中获取一些 pid。
  2. 在原始父级和子级中都调用了第二个 fork,向图片中添加了 2 个进程。 p2在步骤 2 之前存在的 2 个进程中的所有“孙子”中获得 0 和两个不同的 pid。
  3. 第三个 fork 在四个不同的进程中被调用,在图中添加了四个其他进程。
于 2013-02-10T15:27:54.057 回答
4

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

kill(p1, SIGSTOP);

或者,更明智的是,由于您只是分叉,因此可以完全控制代码,您可以处理路径:

if (in_child_1)
    sleep(..);

作为旁注,在您的代码中创建的进程比您预期的要多。事物一旦p1被创建,它就会从该点开始执行,与它的 parent 并行。等等。

于 2013-02-10T15:22:10.967 回答