C信号和过程

时间:2010-04-23 12:31:02

标签: c process signals

所以基本上我希望“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);

}

2 个答案:

答案 0 :(得分:2)

如果发送信号,

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

此外,您可以使用其中一个等待系统调用来查看子进程的状态更改(包括退出)。

您还应该查看父进程中SIGCHLD的信号处理,当孩子改变状态(包括退出)时,父进程将接收信号处理,并且还会使父进入睡眠状态(尽管在某些系统上睡眠功能)可能会重新开始睡觉。)

如果孩子在你的时间限制内退出,你可以使用等待和/或SIGCHLD让父母更快完成。

您应该注意,您可能应该等待子进程退出,这样您就不会创建僵尸(已调用exit但必须保留的进程,以防父进程查看其退出状态)。

你想要研究的另一件事是errno值EINTR,如果系统调用被信号中断,它们可以设置它。

从命令行输入:

man errno
man 2 wait
man 2 sigaction

有关我所谈及的事情的更多信息。

答案 1 :(得分:1)

你的意思是这样吗?

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); 

}