参考书上都是这个方式给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