c语言里获取pid的函数 只有 getpid 和getppid,分别是获取自己的pid或父进程的pid。但不能获取其他指定名称的进程。
所以只能通过调取system执行系统命令,但是如果直接用pkill 命令有些系统可能不支持,并且可能会关不掉(比如正赶上该进程在sleep就会关不掉)。需要明确指定进程号才能确保真正关闭。
根据进程名称获取进程号的系统命令有 pgrep 和 pidof,不过前者对于用脚本启动的进程无法直接获得,后者在有些系统不支持。此外ps 可以查看系统所有进程。
下面是3个命令各自的运行情况,可以看到pgrep 获得不了ntpswitch 的进程号,但是用 关键词“sh”可以获得。
[root]$ps
PID USER VSZ STAT COMMAND
1 root 2344 S init
8857 root 1956 S /APP/ntpclient -s -t -h 114.118.7.161 -i 60 -l
8859 root 2344 S /bin/sh /APP/ntpswitch
18260 root 2348 S -sh
[root]$pgrep ntpclient
8857
[root]$pgrep ntpswitch
[root]$pidof ntpswitch
8859
[root]$pgrep sh
8859
下面示例采用的方法是popen获得 pidof 的打印信息,分析打印信息,再用kill函数关闭指定pid的进程。其中thrName是进程名。
void pidClose(void)
{
unsigned int pidNum=0;
FILE *cmdRst=NULL;
char tempBuf[32]={0};
cmdRst = popen("pidof thrName"r");
if(cmdRst != NULL)
{
fgets(tempBuf, (32-1), cmdRst);
pclose(cmdRst);
pidNum = atoi(tempBuf);
if(pidNum!=0) kill(pidNum, SIGKILL);
}
}
另外也可以用系统命令“kill -9”替代kill函数,或者编写一个脚本,再用system调用这个脚本。关于脚本的编写可以看我的另一篇文章。