c - fork 和 usleep 错误

标签 c fork usleep

我写这段代码: http://ideone.com/cNypUb

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

void signchld (int signal){
    fprintf (stderr, "[X] child exited\n");
}


int main(){
    signal (SIGCHLD, signchld);
    int i;
    for(i=0;i<=300;i++){
        pid_t f;
        f=fork();
        if(f==0){
            //child
            usleep(3*1000000);
            fprintf (stderr, "[C1] %d\n",i);
            exit(0);
            fprintf (stderr, "[C2] %d\n",i);
        }else if(f>0){
            fprintf (stderr, "[P1] %d\n",i);
            usleep(20000000);
        fprintf (stderr, "[P2] %d\n",i);
        }
    }
    return 0;
}

但是 [p2] 每 3 秒运行一次,然后运行下一个循环

我希望看到这个输出:

[P1] 0
[C1] 0
[X] child exited

20秒后

[P2] 0
[P1] 1
[C1] 1
[X] child exited

最佳答案

是信号处理程序 signchld() 中断了父级中的 usleep(),我们可以通过代入来证明

usleep(20000000);

if (usleep(20000000) < 0) {
    if (errno == EINTR)
        fprintf (stderr, "[PX] usleep() interrupted by a signal\n");
}

(当然包括 errno.h)。这将打印

[P1] 0
[C1] 0
[X] child exited
[PX] usleep() interrupted by a signal
[P2] 0
[P1] 1

等等。

在我的系统 (GNU/Linux) 上,usleep() 的手册页内容如下:

4.3BSD, POSIX.1-2001. POSIX.1-2001 declares this function obsolete; use nanosleep(2) instead. POSIX.1-2008 removes the specification of usleep().

Only the EINVAL error return is documented by SUSv2 and POSIX.1-2001.

关于c - fork 和 usleep 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255042/

相关文章:

c - 遍历 C 中的枚举?

c - Windows和Linux用c跨平台。如何隐藏功能?

windows - 使用cmd依次打开多个程序

PHP 输出缓冲区基准测试(与 usleep 一起使用时微时间不准确?)

c - 是否有某种命令可以在程序中创建延迟

c++ - 如何获得 if 表达式的哪一部分为真?

forking() 和 CreateProcess()

c - 等待来自多个进程的信号时 sigwait 有什么问题

c++ - 在 C++ (Windows) 中放弃处理器时间

c - 用 0 填充 C 数组