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 的孩子,后面的都不會有該孩子了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM