日期:2014-05-16  浏览次数:20719 次

不知道进程的pid,如何向它发送一个信号?
参考书上都是这个方式给PID进程发信号,
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了。
------解决方案--------------------
1,父子进程fork获得
2,无亲缘进程,预先约定写Pid文件
3,system执行killall, 其他类似方法都一样道理, 调shell即可
------解决方案--------------------
其实主要看你想发信号的进程是否是协作进程,即你是否能改变其源码或者你是否能让你的进程fork后exec产生。这种情况进程PID怎么都能获取了。
如果不是协作进程,,那你就只能通过各种方法根据进程名获取PID了。
------解决方案--------------------
自己写代码实现ps的功能,
遍历/proc下所有的文件,然后查询/proc/pid/comm 便知进程名, 如果匹配,则pid为进程pid
 
------解决方案--------------------
printf("pid = %d\n",getpid());
------解决方案--------------------
楼主可以system直接调一条命令来干这事。
类似这样: kill -9 `ps -ef|grep name|awk '{print $2} '`
------解决方案--------------------
探讨

引用:

2,无亲缘进程,预先约定写Pid文件


这个话的意思是预先在一个文件里面把需要的pid存储起来不?

------解决方案--------------------
如果你能改目标进程程序的源码的话,,,那获得PID就很简单了,,写文件,socket(包括unix域),fifo等进程间通信都可以通知你的程序它的PID

不用改目标程序源文件的方法,用你的程序使用fork+exec,把目标程序包装下,,,,运行你的程序来启动目标程序,