900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > linux子进程崩溃父进程如何得知并重启子进程 子进程崩溃父进程如何得知并重启子进程...

linux子进程崩溃父进程如何得知并重启子进程 子进程崩溃父进程如何得知并重启子进程...

时间:2021-05-19 05:48:18

相关推荐

linux子进程崩溃父进程如何得知并重启子进程 子进程崩溃父进程如何得知并重启子进程...

子进程崩溃父进程如何得知并重启子进程

发布时间:-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); //子进程出错处理 ,到这行就不会往下跑了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。