LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1004|回复: 7

通过进程名字杀死进程

[复制链接]
发表于 2008-1-7 11:27:44 | 显示全部楼层 |阅读模式
1.在C程序中,如果通过system函数来调用相应的命令根据进程的名字来杀死进程?

比如有一个pppd进程在运行了,我通过调用system("killall pppd");根本就无法杀死pppd这个进程,这是为什么呢?

2.在程序中如何判断这个进程(就比如pppd)是否在运行了?
发表于 2008-1-7 12:10:53 | 显示全部楼层
1. 确保你的程序有足够的权限, 比如用 root 来执行. 另外用 killall -9 pppd 代替 killall pppd , 这会用 SIGKILL 代替 SIGTERM 信号. 试试看以上方法行不行

2. 可以用 ps 搭配 grep . 比如 ps -ef | grep [p]ppd . 这样检查 system() 的返回值即可
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-7 12:27:25 | 显示全部楼层
很感谢你的回复,不过能否说得详细些?

如何通过system的返回值来判断是否在运行呢?

ret = system(" ps -ef | grep pppd");?

那个[p]ppd,这中间的中括号,是什么意思啊?

谢谢了!
回复 支持 反对

使用道具 举报

发表于 2008-1-7 16:11:00 | 显示全部楼层
关于 system() 的返回值请参见 man 3 system

关于 grep 的问题, 楼主可以在 shell 里敲

  1. ps -ef | grep bash
  2. ps -ef | grep [b]ash
复制代码

看看它们有什么区别. 进一步信息请参见 man ps, man grep
回复 支持 反对

使用道具 举报

发表于 2008-1-8 08:41:21 | 显示全部楼层
是不是可以考虑发一个SIGINT信号给进程,
这样的话如果进程有响应事件的话,可以释放资源后再关闭
感觉好一点
回复 支持 反对

使用道具 举报

发表于 2008-1-8 09:00:49 | 显示全部楼层
要想发 INT 信号给它, 利用 system() 通过 kill -s SIGINT 就行了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-8 09:37:24 | 显示全部楼层
我现在是在arm+linux平台下,用的是busybox,但是现在就根本就不能通过"killall 进程名"来杀死进程,当我执行这样的命令(killall -9 pppd)时,它会提示这样的错误(killall: no process-name)这是为什么呢?


这是killall的help:
killall

killall [-l] [-q] [-signal] process-name [process-name ...]
Send a signal (default is TERM) to the specified process(es)

Options:

        -l      List all signal names and numbers
        -q      Do not complain if no processes were killedExample:

        $ killall apache
回复 支持 反对

使用道具 举报

发表于 2008-1-8 09:57:05 | 显示全部楼层
楼主帖一下在板子上如下几个命令的结果

  1. ls /proc/
  2. ps
  3. killall -9 sh # 换个别的 ps 中列出的进程也可以
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表