子进程崩溃父进程如何得知并重启子进程
发布时间:-11-30 16:00:14来源:红联作者:skywing
大家好,我有一个程序,主进程中fork出两个进程,子进程循环执行任务, 我想做一个控制,在子进程崩溃时,让父进程获取子进程一个信号,并重启一个子进程,保证一直有两个子进程在工作。
我使用了signal(SIGCLD, sig_process);
sig_process函数如下:
static void sig_process(int signum)
{
int pid_t,pstatus,acsid;
switch( signum )
{
case SIGCHLD:
pid_t = wait( &pstatus );
if(pid_t > 0)
{
for( acsid = 1 ; acsid <= SHMINFO->EPOLLNUM ;acsid++ )
{
printf("SHMINFO->SU_EPOLLS[%d-1].pid=%d,pid_t=%d\n",acsid,SHMINFO->SU_EPOLLS[acsid-1].pid,pid_t);
if( SHMINFO->SU_EPOLLS[acsid-1].pid == pid_t )
{
printf("set the acs%d state\n",acsid);
P_Action(SEM_I_ID, 0);
SHMINFO->SU_EPOLLS[acsid-1].state = 4;
V_Action(SEM_I_ID, 0);
printf("set the acs%d state end\n",acsid);
siglongjmp(env_startacs, 1);//跳转至先前的setjmp处
}
}
}
break;
}
}
在父进程中有一个循环去重启子进程:
while(1)
{
if( sigsetjmp(env_startacs, 1) == 0 ) //设置记号
{
printf("setjmp ok.....\n");
}
else
{
printf("longjmp ok.....\n");
}
printf("start wait.....\n");
signal(SIGCLD, sig_process); //子进程出错处理
for( acsid = 1 ; acsid <= epnum ;acsid++ )
{
//printf("circle acsid=%d\n",acsid);
if( SHMINFO->SU_EPOLLS[acsid-1].state == 4 )
{
printf("start_acsserver_worker acsid=%d \n",acsid);
start_acsserver_worker( argc , argv , envp , acsid , listenfd );
}
}
}
但是signal(SIGCLD, sig_process); //子进程出错处理 ,到这行就不会往下跑了