我通过编写将用作信号处理程序的函数kill_parent_process来开始发信号和练习。
此func将要求父项退出()(发送SIGKILL或其他方法)。我这样做是让孩子向父母和处理程序exit()发送信号。但我觉得这就是问题所在,因为当我退出时,我可能只是退出子进程。但是,看起来从未调用过处理程序。这是我的代码
void kill_parent_process(int code) {
fprintf(stderr, "KIll the Parent\n");
exit(1);
}
int main() {
struct sigaction sa;
sa.sa_handler = kill_parent_process;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
int r = fork();
if (r == 0) {
sigaction(SIGUSR1, &sa, NULL);
kill(getppid(), SIGUSR1);
exit(1);
} else if (r > 0) {
while (1) {
sleep(1);
printf("%d\n",getpid());
}
int status;
wait(&status);
if (WIFEXITED(status)) {
int result = WEXITSTATUS(status);
fprintf(stderr, "%d\n", result);
}
}
}
当我运行程序并且从未调用过kill_parent_process时,我收到消息用户定义信号1:30。这段代码有什么问题?
答案 0 :(得分:0)
以下提议的代码:
现在建议的代码:
#include <stdio.h> // perror(), puts()
#include <stdlib.h> // exit(), EXIT_FAILURE, EXIT_SUCCESS
#include <sys/types.h> // for 'kill()' and 'getppid()'
#include <signal.h> // kill()
#include <unistd.h> // getppid(), fork()
int main( void )
{
pid_t pid = fork();
if( pid < 0 )
{
perror( "fork failed" );
exit( EXIT_FAILURE );
}
else if( pid == 0 )
{ // then child
puts( "in child process" );
kill( getppid(), SIGUSR1 );
exit( EXIT_SUCCESS );
}
else // if ( pid > 0 )
{ // then parent
while(1)
{
puts( "in parent process" );
sleep(1);
}
}
}
建议代码的(典型)输出是:
in parent process
in child process
User defined signal 1