UNIX进程怎么杀不死?

binb 2000-07-12 07:31:00
有如下一段代码
while( j++<3 ) {
if ((d_pid=fork())==0) {
printf("\n Now is sub-process !");
signal(SIGUSR2,quit_music);
for (;;)
signal(SIGUSR1,play_music);
exit(0);
}
else {
if (d_pid) {
printf("\n d_pid=[%d]", d_pid);
kill(d_pid, SIGUSR1);
}
/*do other thing */
if (d_pid) kill(d_pid,SIGKILL);
.....
   continue;
}
有几个问题请指教!
1。 为何SIGKILL好象杀不死进程d_pid,因为fork产生的进程老是在加1
比如上次显示的d_pid是694,continue后fork 产生的是695
2。 signal(SIGUSR1,play_music);为何要加for语句,否则很少执行
play_music.
3. 有60个包含上述代码的相同程序在运行,内存要求是不是很大?64M
够不?
  谢谢!
...全文
380 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
genesis 2000-07-19
  • 打赏
  • 举报
回复
最后补充一点,说ps -t杀死进程,我不大相信。怀疑是父进程先于子进程终结,子进程被init(进程1)领养了,所以才看不见了。
genesis 2000-07-18
  • 打赏
  • 举报
回复
#include <signal.h>
#include <stdio.h>
void quit(int );
void play(int );
int main()
{
int j=0;
pid_t dpid=1; //dpid赋初值,主要防止子进程的fork
while (j++<3&&dpid!=0){
if ((dpid=fork())==0){
printf("%da",j);
signal(SIGUSR2,quit);
signal(SIGUSR1,play);
pause(); //等待响应信号
}

else {
printf("%d\n",dpid);
kill(dpid,SIGUSR1);
sleep(10); //play_music的时间长度(此处为play)
kill(dpid,SIGKILL);
}
}
for(;;);
return 0;
}

void play(int signo)
{
printf("Play\n");
}

void quit(int signo)
{
printf("Quit\n");
}
试试上述程序,三十秒后剩父进程和三个僵尸子进程,由于子进程无exit(0),所以子进程是被kill(dpid,SIGKILL)杀掉的,(可以去掉此句,三十秒后用ps看看区别)
如果在子进程中用exit,则可省去父进程中的sleep和kill(dpid,SIGKILL)语句,我个人倾向此种方法。
用pause可能意义更清晰,个人观点。
注意对僵尸进程的即时回收,可以降低对内存的要求。
另外补充一点,fork的子进程数是有限的,是受系统限制的,除非对内核进行编译,否则恐怕难以突破。如果limits.h中没有,可用sysconf(_SC_CHILD_MAX)来看,有些UNIX环境下_SC_CHILD_MAX和文件中的CHILD_MAX并不一致,文件中应有说明,一般可以认为_SC_CHILD_MAX就是系统内核的上限。受其他方面的影响,一般也达不到此上限。
#include<unistd.h>
long sysconf(int name)
binb 2000-07-16
  • 打赏
  • 举报
回复
?
binb 2000-07-13
  • 打赏
  • 举报
回复
?
vagabond 2000-07-12
  • 打赏
  • 举报
回复
1。 为何SIGKILL好象杀不死进程d_pid,因为fork产生的进程老是在加1
比如上次显示的d_pid是694,continue后fork 产生的是695
2。 signal(SIGUSR1,play_music);为何要加for语句,否则很少执行
play_music.
3. 有60个包含上述代码的相同程序在运行,内存要求是不是很大?64M
够不?

1。应该可以杀死进程。SIGKILL是无条件的不能屏蔽的信号。至于continue后产生695
则是因为系统的进程号是不断的递增的。
2。加for循环则很可能是因为quit_music需要一个时间延时,在SIGUSR2信号中断时,进程不接受其他的中断,这样,你的SIGUSR1就被忽略了。你可以
在两个信号中作一个保证quit_music完成的延时试试。
signal(SIGUSR2,quit_music);
//wait long time while quit_music done.
signal(SIGUSR1,play_music);

3。fork对内存的需求并不太大(在linux等系统中,它采用的是“改变拷贝”的技术,这样它占用的内存是很少的),64M对60个进程应该没有问题,关键是你的play_music是不是使用了大量的内存?
binb 2000-07-12
  • 打赏
  • 举报
回复
请高手帮忙!
binb 2000-07-12
  • 打赏
  • 举报
回复
谢谢,
1为何ps -t tty02(程序在tty02运行)看不到子进程?如何看子进程?
2。我把signal(SIGUSR2,quit_music)去掉,还必须加for?
2。我编的是在unix下,大小400k左右,play_music只是放一端语音。
请指教!

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧