一、kill接口信息描述
头文件:#include <sys/types.h>
#include <signal.h>
定义函数:int kill(pid_t pid, int sig);
说明:系统调用kill()用来送参数sig 指定的信号给参数pid 指定的进程或它的进程组。
参数pid 有几种情况:
1、pid>0 将信号传给进程识别码为pid 的进程;
2、pid=0 将信号传给和目前进程相同进程组的所有进程;
3、pid=-1 将信号广播传送给系统内所有的进程,init进程除外;
4、pid<-1 将信号传给进程组识别码为-pid的所有进程。
返回值:执行成功则返回0, 否则返回-1。
二、waitpid接口信息描述
头文件:#include <sys/types.h>
#include <sys/wait.h>
定义函数:pid_t waitpid(pid_t pid, int * status, int options);
说明:waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用waitpid()时子进程已经结束,则waitpid()会立即返回子进程结束状态值保存在参数status 里,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status 可以设成NULL。
参数pid 为欲等待的子进程识别码:
1、pid<-1 等待进程组识别码为pid 绝对值的任何子进程。
2、pid=-1 等待任何子进程, 相当于wait()。
3、pid=0 等待进程组识别码与目前进程相同的任何子进程。
4、pid>0 等待任何子进程识别码为pid 的子进程。
参数status:保存子进程的结束状态值。如果不使用status,将其设置成NULL。
参数option 可以为0 或下面的OR 组合:
WNOHANG:如果没有任何已经结束的子进程则马上返回, 不阻塞进程执行;
WUNTRACED:如果子进程进入暂停执行情况则马上返回, 但结束状态不予以理会. 子进程的结束状态返回后存于status, 底下有几个宏可判别结束情况;
WIFEXITED(status):如果子进程正常结束则为非0 值;
WEXITSTATUS(status):取得子进程exit()返回的结束代码, 一般会先用WIFEXITED 来判断是否正常结束才能使用此宏;
WIFSIGNALED(status):如果子进程是因为信号而结束则此宏值为真;
WTERMSIG(status):取得子进程因信号而中止的信号代码, 一般会先用WIFSIGNALED 来判断后才使用此宏;
WIFSTOPPED(status):如果子进程处于暂停执行情况则此宏值为真. 一般只有使用WUNTRACED时才会有此情况;
WSTOPSIG(status):取得引发子进程暂停的信号代码, 一般会先用WIFSTOPPED 来判断后才使用此宏。
返回值:如果执行成功,则返回子进程识别码(PID),如果有错误发生则返回-1,失败原因存于errno 中。
三、一个简单的栗子
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wait.h>
int main(int argc, char const *argv[])
{
pid_t pid = fork();
if (pid == -1)
{
perror("fork() failed.");
exit(EXIT_FAILURE);
}
else if (pid == 0)
{
puts("I'm child process, sleep 100 second, then end.");
sleep(100);
exit(EXIT_SUCCESS);
}
else
{
int status = 0;
if (0 == waitpid(pid, &status, WNOHANG))
{
sleep(30);
int ret = kill(pid, SIGKILL);
if (ret)
{
printf("kill child proces[%d] failed\n", pid );
perror("kill failed.");
waitpid(pid, &status, 0);
}
else
{
printf("process[%d] killed.\n", pid);
}
}
}
return 0;
}
执行结果:
[xy@xunye signal]$ ./a.out
I'm child process.
process[16419] killed.