当前位置: 技术问答>linux和unix
如何在父进程中控制子进程??
来源: 互联网 发布时间:2015-06-19
本文导语: 我有一个守护进程,一直在监听socket连接,客户进程向这个守护进程发命令, 守护进程收到后fork一个子进程去执行相应的操作。具体程序如下: printf("Server Startingn"); switch (fork()) { case -1: /* Unable to fork */ ...
我有一个守护进程,一直在监听socket连接,客户进程向这个守护进程发命令,
守护进程收到后fork一个子进程去执行相应的操作。具体程序如下:
printf("Server Startingn");
switch (fork())
{
case -1: /* Unable to fork */
fprintf(stderr, "unable to fork daemonn"); exit(1);
case 0:
fclose(stdin);
signal(SIGCLD,SIG_IGN);
for(;;)
{
sin_size = sizeof(struct sockaddr_in);
new_fd = accept(socketfd,(struct sockaddr *(&their_addr,&sin_size);
if(new_fd == -1)
{
exit(1);
}
switch(fork())
{
case -1:
close(new_fd);
exit(1);
case 0:
server_mgr();
_exit(0);
default:;
}
}
default:;
}
可我发现一段时间后系统中出现了下面这样的情况:
ps -ef|grep netserver
pasjk 31680 42560 95 18:12:20 pts/16 24:36 ./netserver
pasjk 42560 1 0 16:46:56 pts/16 0:06 ./netserver
pasjk 47396 42560 2 18:37:47 pts/16 0:00 ./netserver
进程号为:31680的进程一直不退出,如果我把它kill掉的话,过一会又会产生一个同样的进程,
可是我的子进程的操作已经早就完了,这样的进程在很多进程中只会产生一个,
我想在父进程中监控子进程的执行时间,如果超时的话,就把它关掉,
我该怎么做才能实现??
我的操作系统是AIX.
守护进程收到后fork一个子进程去执行相应的操作。具体程序如下:
printf("Server Startingn");
switch (fork())
{
case -1: /* Unable to fork */
fprintf(stderr, "unable to fork daemonn"); exit(1);
case 0:
fclose(stdin);
signal(SIGCLD,SIG_IGN);
for(;;)
{
sin_size = sizeof(struct sockaddr_in);
new_fd = accept(socketfd,(struct sockaddr *(&their_addr,&sin_size);
if(new_fd == -1)
{
exit(1);
}
switch(fork())
{
case -1:
close(new_fd);
exit(1);
case 0:
server_mgr();
_exit(0);
default:;
}
}
default:;
}
可我发现一段时间后系统中出现了下面这样的情况:
ps -ef|grep netserver
pasjk 31680 42560 95 18:12:20 pts/16 24:36 ./netserver
pasjk 42560 1 0 16:46:56 pts/16 0:06 ./netserver
pasjk 47396 42560 2 18:37:47 pts/16 0:00 ./netserver
进程号为:31680的进程一直不退出,如果我把它kill掉的话,过一会又会产生一个同样的进程,
可是我的子进程的操作已经早就完了,这样的进程在很多进程中只会产生一个,
我想在父进程中监控子进程的执行时间,如果超时的话,就把它关掉,
我该怎么做才能实现??
我的操作系统是AIX.
|
这应该是进程间通信的问题。
可以去看看《UNIX网络编程 第二版》。里面就是讲这个问题。
可以去看看《UNIX网络编程 第二版》。里面就是讲这个问题。
|
实现超时控制很麻烦的,还是查一下server_mgr()这个函数,可能是某些特殊数据引起程序
停止在某点.要不把 _exit()用exit()替换一下试试.还有一点,你的子进程退出时,父进程
没有wait()啊,这样会产生很多僵尸进程的,会把主机搞垮的. 你的程序运行时 ps -ef|grep defunct 看一下,有标志的就是僵尸进程,会占用资源不释放.
停止在某点.要不把 _exit()用exit()替换一下试试.还有一点,你的子进程退出时,父进程
没有wait()啊,这样会产生很多僵尸进程的,会把主机搞垮的. 你的程序运行时 ps -ef|grep defunct 看一下,有标志的就是僵尸进程,会占用资源不释放.
|
创建daemon的进程应该调用wait等待,否则daemon就会被孤立。
|
用kill()发送相应的信息
参数很多的时候把数据放在某个约定的地方,如文件,共享内存中等,子进程收到父进程发出的约定信号后,就读取数据,根据数据来做进一步的动作
参数很多的时候把数据放在某个约定的地方,如文件,共享内存中等,子进程收到父进程发出的约定信号后,就读取数据,根据数据来做进一步的动作