进程间通信之使用kill发送信号

一、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.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值