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

Sti*_*Sti 3 c unix sleep fork process

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

我正在尝试制作两个睡眠时间为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);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我不明白如何处理流程,或者它们到底是什么.我有点把它们视为对象,但我猜这是错的..我已经尝试过读一些关于它的东西了,但是它们都是9000多页的PDF文件.我应该看到它们的简单解释. .是的,这是学校教材,但不,这不是作业.

cni*_*tar 5

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

kill(p1, SIGSTOP);
Run Code Online (Sandbox Code Playgroud)

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

if (in_child_1)
    sleep(..);
Run Code Online (Sandbox Code Playgroud)

附带说明一下,在您的代码中创建的进程比您预期的要多。事情是一旦p1创建,它就会从该点开始执行,与其父级并行。等等。


Ant*_*nko 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(...);
}
Run Code Online (Sandbox Code Playgroud)

您通常不会告诉子进程执行此操作,您只需将代码添加到相应的if分支.

在您的示例中,如果所有分支都成功,则最终会有8个进程:

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