当前位置: 技术问答>linux和unix
不知道进程的pid,如何向它发送一个信号?
来源: 互联网 发布时间:2017-03-11
本文导语: 参考书上都是这个方式给PID进程发信号, kill(PID, SIGUSR1); 1)但是在系统运行中,如何获取这个pid(肯定不能手动敲ps吧?) 2)或者有没有其他的方法使得进程A向进程B发送SIGUSR1? 谢谢 | ...
参考书上都是这个方式给PID进程发信号,
kill(PID, SIGUSR1);
1)但是在系统运行中,如何获取这个pid(肯定不能手动敲ps吧?)
2)或者有没有其他的方法使得进程A向进程B发送SIGUSR1?
谢谢
kill(PID, SIGUSR1);
1)但是在系统运行中,如何获取这个pid(肯定不能手动敲ps吧?)
2)或者有没有其他的方法使得进程A向进程B发送SIGUSR1?
谢谢
|
方法一
FILE *popen(const char *command, const char *type);
command字符串写ps -C PROCESS_NAME ,,,
然后解析下从FILE中读的字符就行了。
方法二
当然也可以用fork + pipe + execl + ps的方法重定向终端输出1
然后read pipe,解析字符串。得到pid.
方法三
system函数调用shell脚本 。这个简单,因为脚本解决字符方便。
方法四
参考ps的实现方法。 (这个我没看过ps源码,我猜应该是读取/proc中的文件和文件夹得到的,参见man 5 proc)
/proc目录下面的数字文件夹就表示每个进程的PID,,
/proc/$PID目录下cmdline文件存的就是他的参数,,文件里第一个参数就是指他的进程名了!
所以你只要写个函数然后遍历/proc/数字目录下的cmdline文件,读取第一个字符串,然后用basename函数取其进程名,,比较是否目标进程名,,若是则其对应的所在目录数字为其PID,,这样就可以调用kill了。
FILE *popen(const char *command, const char *type);
command字符串写ps -C PROCESS_NAME ,,,
然后解析下从FILE中读的字符就行了。
方法二
当然也可以用fork + pipe + execl + ps的方法重定向终端输出1
然后read pipe,解析字符串。得到pid.
方法三
system函数调用shell脚本 。这个简单,因为脚本解决字符方便。
方法四
参考ps的实现方法。 (这个我没看过ps源码,我猜应该是读取/proc中的文件和文件夹得到的,参见man 5 proc)
/proc目录下面的数字文件夹就表示每个进程的PID,,
/proc/$PID目录下cmdline文件存的就是他的参数,,文件里第一个参数就是指他的进程名了!
所以你只要写个函数然后遍历/proc/数字目录下的cmdline文件,读取第一个字符串,然后用basename函数取其进程名,,比较是否目标进程名,,若是则其对应的所在目录数字为其PID,,这样就可以调用kill了。
|
1,父子进程fork获得
2,无亲缘进程,预先约定写Pid文件
3,system执行killall, 其他类似方法都一样道理, 调shell即可
2,无亲缘进程,预先约定写Pid文件
3,system执行killall, 其他类似方法都一样道理, 调shell即可
|
其实主要看你想发信号的进程是否是协作进程,即你是否能改变其源码或者你是否能让你的进程fork后exec产生。这种情况进程PID怎么都能获取了。
如果不是协作进程,,那你就只能通过各种方法根据进程名获取PID了。
如果不是协作进程,,那你就只能通过各种方法根据进程名获取PID了。
|
自己写代码实现ps的功能,
遍历/proc下所有的文件,然后查询/proc/pid/comm 便知进程名, 如果匹配,则pid为进程pid
遍历/proc下所有的文件,然后查询/proc/pid/comm 便知进程名, 如果匹配,则pid为进程pid
|
printf("pid = %dn",getpid());
|
楼主可以system直接调一条命令来干这事。
类似这样: kill -9 `ps -ef|grep name|awk '{print $2} '`
类似这样: kill -9 `ps -ef|grep name|awk '{print $2} '`
|
是的, 这是很经典的做法, 开源软件的标准做法.
|
如果你能改目标进程程序的源码的话,,,那获得PID就很简单了,,写文件,socket(包括unix域),fifo等进程间通信都可以通知你的程序它的PID
不用改目标程序源文件的方法,用你的程序使用fork+exec,把目标程序包装下,,,,运行你的程序来启动目标程序,
不用改目标程序源文件的方法,用你的程序使用fork+exec,把目标程序包装下,,,,运行你的程序来启动目标程序,