0
回答
求助:exec后的进程收不到SIGUSR2信号的问题
最近在写一个软件,收到SIGUSR2信号后fork+exec自己,实现平滑升级,但发现只要exec过一次后即使再次signal或者 sigaction点亮SIGUSR2却死活收不到SIGUSR2了,但可以收到SIGTERM信号。一开始以为是其它地方影响,后来单独写了个小程序, 剔除所有无关代码,一运行还是老样子。

大牛们帮忙看看是什么原因?代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>

int g_exit_flag = 0 ;

static void sig_proc( int sig_no )
{
	if( sig_no == SIGUSR2 )
	{
		pid_t	pid ;
		
		pid = fork() ;
		if( pid == -1 )
		{
			exit(9);
		}
		else if( pid == 0 )
		{
			execlp( "t" , "t" , NULL );
			exit(9);
		}
		
		g_exit_flag = 1 ;
	}
	
	return;
}

int main()
{
	signal( SIGUSR2 , & sig_proc );
	
	while( g_exit_flag == 0 )
	{
		sleep(1);
	}
	
	return 0;
}



测试过程为,编译t.c为t,运行之,用kill -USR2发送USR2信号,看到老进程没了,新进程exec起来了(pid变了),再次kill -USR2时就无效了。

<无标签>
举报
BetonArmEE
发帖于2年前 0回/60阅
顶部