2013-07-17 55 views
1

我有以下两个源文件wait4不会阻止父线程

loop.c中该可执行文件的名称是loop

int main() { 
    while(true); 
    return 0; 
} 

和run.c其可执行文件的名称为run

int main() { 
    pid_t child_pid = fork(); 

    int status; 
    struct rusage info; 

    if (child_pid == 0) { 
     ptrace(PTRACE_TRACEME, 0, NULL, NULL); 
     execl("loop", "loop", NULL); 
     exit(0); 
    } 

    wait4(child_pid, &status, 0, &info); 

    puts("Child exited"); 
    printf("%ld\n", info.ru_utime.tv_usec); 

    return 0; 
} 

我编译了这两个程序,并且我运行了run程序。为什么终止?我读过wait4 suspend,但实际上并没有。当我执行ps程序loop正在运行,并且run没有(它不是在ps和终端似乎完成它的工作通过提供输出)。

我错过了什么吗?

PS

我用GNU G ++编译器,如果它的事宜。

回答

2

我想这个问题是在这里

ptrace(PTRACE_TRACEME, 0, NULL, NULL); 

这里

wait4(child_pid, &status, 0, &info); 

wait4(顺便说一句不建议使用)返回控制,如果处理状态改变。

ptrace的(PTRACE_TRACEME力送孩子家长SIGTRAP如果某些条件 发生,每一次wait4,waitpid函数和相似的功能控制权返回给你, 你需要使用WIFEXITED子进程和SIGTRAP条件的出口之间进行区分。

您可以通过更换wait4调用来检查我的发言:

if (wait4(child_pid, &status, 0, &info) < 0) { 
     perror("wait4 failed"); 
    } else if (WIFEXITED(status)) { 
     printf("process exit\n"); 
    } else 
     printf("child just send signal\n"); 
+0

谢谢你的建议,我在无限循环,实际上它运行一次包裹起来wait4我应该使用,而不是wait4的方式我真的?需要知道子线程的执行时间。 – abc

+0

在您的变体中,您可以使用getrusage(RUSAGE_CHILDREN。 – fghj

+0

顺便说一句,你可以找到类似的模式ptrace + waitpid工作程序,但这个程序的作品,在这里:http://habrahabr.ru/post/111266/。这跟踪系统调用。即使你不懂俄语,文章中的C代码也足以让你明白。 – fghj