- 论坛徽章:
- 0
|
程序简介:父进程创建子进程,子进程中跑实际的应用程序,子进程正常情况下不会退出。父进程负责监视子进程,如果发现其退出则需要重启之。
问题描述:waitpid返回非0,且errno=10, 意思是No child processes, 但实际上此时子进程并未退出,还在sleep中。很奇怪的现象。
/* to monitor if or not my application has exited, if yes, recreate it */
int main()
{
char apppath[1024];
char *appname;
pid_t appId;
pid_t c_pid;
int ret;
sprintf(apppath,"%s","/test/myapp");
appname = basename(sevpath);
re-create:
while(1)
{
waitpid(-1,NULL,WNOHANG);
appId = getpidbyname(appname);
if(appId < 0)
{
break;
}
fprintf(stderr,"child %s existed,kill it pid=%d\n",appname,appId);
kill(appId, SIGKILL);
usleep(500000);
}
c_pid = vfork();
if(c_pid==0)
{
execl(apppath,apppath, NULL, NULL);
}
else if(c_pid < 0)
{
perror("fork");
return (errno);
}
sleep(1);
while(1)
{
ret = waitpid(-1,NULL,WNOHANG);
if(ret != 0)
{
fprintf(stderr,"child exited,go to re-create,errno=%d\n",errno);
sleep(2);
goto repeat_create;
}
sleep(1);
}
return 1;
}
/* my application is under /test/myapp.c */
int main()
{
int fd;
fd = open("/dev/my_device", O_RDWR | O_NOFOLLOW, 0644);
fprintf(stderr,"run my application...\n);
ioctl(fd, MY_IOCTL_RESET, NULL);
...
close(fd);
return 0;
}
/* my device driver, will insmod into kernel */
int my_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
...
case MY_IOCTL_RESET :
pci_read_config_dword(pdev,...);
set_current_state(TASK_UNINTERRUPTIBLE);
WRITE_32(fpga_reset_reg,0x10000);//Reset
printk("before sleep....\n");
msleep(5000);
printk("after sleep....\n");
pci_write_config_dword(pdev,...);
my_probe(pdev, NULL);
set_current_state(TASK_RUNNING);
printk("reset finished.\n");
break;
....
}
打印出来的日志如下:
run my application...
before sleep....
child exited,go to re-create,errno=10
after sleep....
reset finished.
child myapp existed,kill it pid=1200
child myapp existed,kill it pid=1200
child myapp existed,kill it pid=1200
run my application...
before sleep....
省略。。。
请高手帮忙确认下,是否是一个bug, 或者是我的程序中有什么问题?应该如何正确的实现?谢谢!
|
|