gpt4 book ai didi

c - 用 C 语言从 child 向 parent 发送信号。 "User defined signal 1: 30"

转载 作者:行者123 更新时间:2023-11-30 19:31:49 24 4
gpt4 key购买 nike

我是初学者,通过编写一个将用作信号处理程序的函数kill_parent_process来发出信号和练习。

此函数将要求 parent 退出()(发送 SIGKILL 或其他方法)。我所做的方法是让 child 向 parent 和处理程序 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);
}

}
}

当我运行程序时,我收到一条消息 User Defined signal 1: 30 并且从未调用过kill_parent_process。这段代码有什么问题?

最佳答案

以下建议代码:

  1. 执行所需的功能
  2. 干净地编译
  3. 记录了为什么要包含大多数头文件
  4. 不调用任何信号处理程序等,而是使用默认操作
  5. 正确检查并处理错误

现在建议的代码:

#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

关于c - 用 C 语言从 child 向 parent 发送信号。 "User defined signal 1: 30",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47861829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com