kill函数

kill函数/命令产生信号

kill命令产生信号:kill -SIGKILL pid

kill函数:给指定进程发送指定信号(不一定杀死)

    int kill(pid_t pid, int sig);      成功:0;失败:-1 (ID非法,信号非法,普通用户杀init进程等权级问题),设置errno

       sig:不推荐直接使用数字,应使用宏名,因为不同操作系统信号编号可能不同,但名称一致。

    pid > 0:  发送信号给指定的进程。

       pid = 0:  发送信号给 与调用kill函数进程属于同一进程组的所有进程。

       pid < 0:  取|pid|发给对应进程组。

       pid = -1:发送给进程有权限发送的系统中所有进程。

    进程组:每个进程都属于一个进程组,进程组是一个或多个进程集合,他们相互关联,共同完成一个实体任务,每个进程组都有一个进程组长,默认进程组ID与进程组长ID相同。

权限保护:super用户(root)可以发送信号给任意用户,普通用户是不能向系统用户发送信号的。 kill -9 (root用户的pid)  是不可以的。同样,普通用户也不能向其他普通用户发送信号,终止其进程。 只能向自己创建的进程发送信号。普通用户基本规则是:发送者实际或有效用户ID == 接收者实际或有效用户ID

/***
killmyself.c
***/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>

#define N 5

int main()
{
    int ret = kill(getpid(),SIGKILL);
    if(-1 == ret)
        exit(1);

    return 0;
}

kill杀死指定子进程:

/***
killkid.c
***/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>

#define N 5

int main()
{
    int i;
    pid_t pid,q;

    for(i = 0; i < N; i++)
    {
        pid = fork();
        if(0 == pid)
            break;
        if(2 == i)
        {
            q = pid;
        }
    }
    
    if(i < 5)
    {
        while(1)
        {
            printf("I'm a child %d,getpid = %u\n",i,getpid());
            sleep(1);
        }
    }
    else
    {
        kill(q,SIGKILL);
        while(1);
    }

    return 0;
}

运行结果中,第一轮由i = 2 的孩子,后面的都不会有该孩子了。

 

posted @ 2019-08-08 18:04  王清河  阅读(2034)  评论(0编辑  收藏  举报