父进程KILL子进程

rjhzp143 2009-12-31 10:16:44
有关KILL进程的方法。代码大致如下,

在建立一个进程后运行子进程Func2(),子进程中又建了一个孙进程Func3();

我现在想达到的效果是:Func2()在创建孙进程Func3()的时候,先判断上次建立的进程是否存在,如果存在则KILL掉,重新建立孙进程Func3()。

能否用kill(getpid(),SIGKILL)方法来实现,如果能实现,能否详细说明一下?

还是使用_EXIT? exit(0)?请指教。

Void func1()

{

pid_t pid

pid =fork();

Switch(pid)

{

Case -1:

Break;

Case 0:

Func2();

Default:

Break;

}

}

Void func2()

{

pid_t pid

kill(getpid(),SIGKILL);//如果上次存在一个进程,则先KILL再创建。

pid =fork();

Switch(pid)

{

Case -1:

Break;

Case 0:

Func3();

Default:

Break;

}

While(1)

{

………………..

}

}

Void func3()

{

While(1)

{

………………..

}

}

Main()

{

…..

func1();

…..

}

...全文
708 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzh3ng 2010-01-01
  • 打赏
  • 举报
回复
顶8楼,说的好。
alexhilton 2009-12-31
  • 打赏
  • 举报
回复
_exit(0)是自杀, kill是他杀.
最好用_exit(), 免的引发其他问题
deep_pro 2009-12-31
  • 打赏
  • 举报
回复
fork的返回值对于子进程是0
对于父进程就是返回子进程的pid

man waitpid ,这个函数比较复杂

waitpid(子进程pid,&status,WNOHANG) 返回0的话子进程还活着,否则返回子进程pid
rjhzp143 2009-12-31
  • 打赏
  • 举报
回复
惭愧,刚学。
我可能说的不是太清楚。程序第一次运行,一路走下去,创建了FUNC3的进程。
然后程序再运行的时候,FUNC2会继续要去生成FUNC3的进程,而在这个时候,要先判断一下FUNC3的进程之前有没有被调用过,有的话先KILL掉再创建。

就是在FUNC2来KILL掉FUNC3的时候不知道怎么判断以及怎么KILL。
请指教
deep_pro 2009-12-31
  • 打赏
  • 举报
回复
kill(getpid(),SIGKILL);//如果上次存在一个进程,则先KILL再创建。
----------
lz这是自杀

很简单的,fun2保存fork()返回后的孙进程的pid
然后waitpid查看孙进程的状态,该杀杀,该留留

iisbsd 2009-12-31
  • 打赏
  • 举报
回复
有问题,kill(getpid(),SIGKILL)里面,getpid是得到自己的进程ID(子进程),和上次创建的孙进程无关。
  • 打赏
  • 举报
回复
在建立一个进程后运行子进程Func2(),子进程中又建了一个孙进程Func3();

我现在想达到的效果是:Func2()在创建孙进程Func3()的时候,先判断上次建立的进程是否存在,如果存在则KILL掉,重新建立孙进程Func3()。

能否用kill(getpid(),SIGKILL)方法来实现,如果能实现,能否详细说明一下?


你知道为何fork的时候父进程接收的返回值要大于0吗?就是便于你父进程存储子进程的pid,你把它存到一个数组,维护起来,就知道还有没有子进程了。
waitpid成功了,就把数组里对应的pid去掉。

杀死子进程是kill(pid,SIGKILL);

pid要自己维护,这么简单的情况,有必要去依赖操作系统么。
dongjiawei316 2009-12-31
  • 打赏
  • 举报
回复
前边的人说得对,你这是自杀。。。
我明白你的意思,
第一次运行程序时父进程创建了进程FUNC3。
然后这个父进程因为某种原因关闭了
程序再次运行时需要再次创建FUNC3,这时你想判断FUNC3是否存在,存在则关闭它。

实际上程序再次运行时,已经不能获取FUNC3的进程PID了。因为在系统看来,这两个进程之间已经没有联系。

我提供个思路吧!
1、通过进程名字查找。查找某一个名字的进程是否存在,这个shell命令可以实现。但我不太清楚
2、FUNC3进程起来后,将自身的进程ID写到临时文件里。然后你的程序可以去读。但这种方法不太可靠。因为ID写入文件后,FUNC3意外结束。没有别个进程用这个ID还好,一旦有别的进程用就麻烦了。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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