繁体   English   中英

C信号和过程

[英]C signals and processes

因此,基本上我希望“ cmd_limit”取一个以秒为单位的数字,这是我们等待子进程完成的最长时间(可以安全地假设只有一个)。 如果子进程确实在睡眠过程中完成,我希望cmd_limit返回pass而不运行其余的cmd_limit代码。 谁能帮我做到这一点,这就是我到目前为止所拥有的。

int cmd_limit( int limit, int pid ) {

    signal( SIGCHLD, child_died );
    sleep( limit );
    kill( pid, SIGKILL );
    printf("killin'\n");
    return PASS;
}

void child_died( int sig ) {

    int stat_loc; /* child return information */
    int status; /* child return status */

    waitpid( -1, &stat_loc, WNOHANG );

    if( WIFEXITED(stat_loc) ) { // program exited normally
        status = WEXITSTATUS( stat_loc ); /* get child exit status */
    }

    printf("child died: %s\n", signal);

}

如果发送了信号,kill将返回0,如果没有发送信号,则返回-1。 如果该进程已经退出,则不会发送任何信号,因此kill的返回值可用于告诉您该进程是被kill杀死还是已经死亡。

另外,您可以使用wait系统调用之一来查看子进程的状态更改(包括exit)。

您还应该研究父进程中SIGCHLD的信号处理,当子进程更改状态(包括exit)时,父进程会收到该信号,并且还会使父进程退出睡眠状态(尽管在某些系统上,睡眠功能可能会重新开始睡眠) )。

如果孩子在您的时限内退出,则使用wait和/或SIGCHLD可以使父母更快完成工作。

您应该注意,您可能应该调用wait等待子进程退出,以免创建僵尸(已调用exit但必须保留在周围的进程,以防父进程希望查看其退出状态)。

您还要查看的另一件事是errno值EINTR,如果系统调用被信号中断,则可以设置该值。

在命令行中输入:

man errno
man 2 wait
man 2 sigaction

有关我所谈论的内容的更多信息。

你是说这个意思吗

bool childDied;

int cmd_limit( int limit, int pid ) {
    childDied = FALSE; 
    signal( SIGCHLD, child_died ); 
    sleep( limit ); 
    if (!childDied)
    {
      kill( pid, SIGKILL ); 
      printf("killin'\n"); 
    }
    return PASS; 
} 

void child_died( int sig ) {
    int stat_loc; /* child return information */ 
    int status; /* child return status */ 

    childDied = TRUE; 

    waitpid( -1, &stat_loc, WNOHANG ); 

    if( WIFEXITED(stat_loc) ) { // program exited normally 
        status = WEXITSTATUS( stat_loc ); /* get child exit status */ 
    } 

    printf("child died: %s\n", signal); 

} 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM