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

?

轉載于:https://www.cnblogs.com/wanghao-boke/p/11320878.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384885.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384885.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384885.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

下標運算符重載

重載該運算符用于增強操作C數組的功能。 /*** subscript.cpp ***/ #include<iostream> using namespace std; const int SIZE 10;class safearay {private:int arr[SIZE];public:safearay(){register int i;for(i 0; i < SIZE ;i){arr[i] i;} }int& operator…

賦值運算符重載

重載賦值運算符&#xff08;&#xff09;&#xff0c;用于創建一個對象&#xff0c;比如拷貝構造函數。 /*** evaluate.cpp ***/ #include<iostream> using namespace std;class Distance {private:int feet;int inches;public:Distance(){feet 0;inches 0;}Distance(i…

運算符小括號重載

函數調用運算符()可以被重用于類的對象。當重載()時&#xff0c;沒有創造一個新的調用函數的方式&#xff0c;相反地&#xff0c;這是創建一個可以傳遞任意數目參數的運算符函數。 /*** bracke.cpp ***/ #include<iostream> using namespace std;class Distance {private…

自增自減運算符重載

遞增運算符&#xff08;&#xff09;和遞減運算符&#xff08;--&#xff09;是C語言中兩個重要的一元運算符。 /*** addMyself.cpp ***/ #include<iostream> using namespace std;class Time {private:int hours;int minutes;public:Time(){hours 0;minutes 0;}Time(i…

輸入輸出運算符重載

C能夠使用流提取運算符>>和流插入運算符<< 來輸入輸出內置數據類型&#xff0c;也可以重載流提取運算符和流插入運算符來操作對象等用戶自定義的數據類型。 我們有時需要把運算符重載函數聲明為類的友元函數&#xff0c;這樣我們就能不用構造對象而直接調用函數。 …

alarm函數

alarm函數 設置定時器(鬧鐘)。在指定seconds后&#xff0c;內核會給當前進程發送14&#xff09;SIGALRM信號。進程收到該信號&#xff0c;默認動作終止。 每個進程都有且只有唯一個定時器。 unsigned int alarm(unsigned int seconds); 返回0或剩余的秒數&#xff0c;無失敗…

信號捕捉

signal函數 注冊一個信號捕捉函數&#xff1a; typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 該函數由ANSI定義&#xff0c;由于歷史原因在不同版本的Unix和不同版本的Linux中可能有不同的行為。因此應該盡量避免使用它&#x…

打印未決信號集

信號集操作函數 內核通過讀取未決信號集來判斷信號是否應被處理。信號屏蔽字mask可以影響未決信號集。而我們可以在應用程序中自定義set來改變mask。已達到屏蔽指定信號的目的。 信號集設定 sigset_t set; // typedef unsigned long sigset_t; int sigemptyset(sigset_…

sigaction()函數

sigaction函數 修改信號處理動作&#xff08;通常在Linux用其來注冊一個信號的捕捉函數&#xff09; int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 成功&#xff1a;0&#xff1b;失敗&#xff1a;-1&#xff0c;設置errno 參數&a…

內核實現信號捕捉原理

信號捕捉特性 進程正常運行時&#xff0c;默認PCB中有一個信號屏蔽字&#xff0c;假定為☆&#xff0c;它決定了進程自動屏蔽哪些信號。當注冊了某個信號捕捉函數&#xff0c;捕捉到該信號以后&#xff0c;要調用該函數。而該函數有可能執行很長時間&#xff0c;在這期間所屏蔽…

pause函數

pause函數 調用該函數可以造成進程主動掛起&#xff0c;等待信號喚醒。調用該系統調用的進程將處于阻塞狀態(主動放棄cpu) 直到有信號遞達將其喚醒。 int pause(void); 返回值&#xff1a;-1 并設置errno為EINTR 返回值&#xff1a; ① 如果信號的默認處理動作是終止進程&a…

SIGCHLD函數

SIGCHLD的產生條件 子進程終止時 子進程接收到SIGSTOP信號停止時 子進程處在停止態&#xff0c;接受到SIGCONT后喚醒時 借助SIGCHLD信號回收子進程 子進程結束運行&#xff0c;其父進程會收到SIGCHLD信號。該信號的默認處理動作是忽略。可以捕捉該信號&#xff0c;在捕捉函數中…

成員訪問控制符重載

類成員訪問運算符&#xff08;->&#xff09;可以被重載&#xff0c;但它比較麻煩它被定義用于為一個類賦予“指針”行為。運算符->必須是一個成員函數。如果使用了->運算符&#xff0c;返回類型必須是指針或者是類的對象。 運算符->通常與指針引用運算符 * 結合使…

C++動態內存

C程序中內存分為兩個部分 棧&#xff1a;在函數內部聲明的所有變量都將占用棧內存。 堆&#xff1a;這是程序中未使用的內存&#xff0c;在程序中可用于動態分配內存。 在很多時候&#xff0c;我們無法提前預知需要多少內存來存儲某個變量的特定信息&#xff0c;所需內存的大小…

文件和流

iostream標準庫提供了cin和cout方法用于標準輸入讀取流和向標準輸出寫入流。 從文件讀取流和向文件寫入流&#xff0c;需要用到fstream庫。它定了三個數據類型 數據類型 描述 ofstream 該數據類型表示輸出文件流&#xff0c;用于創建文件并向文件寫入信息 ifstream 該數據…

C++預處理器

預處理器是一些指令&#xff0c;指示表一起在實際編譯之前所需要完成的預處理。 所有的預處理器指令都是以井號(#)開頭&#xff0c;只有空格字符可以出現在預指令處理之前。預處理指令不是C語句&#xff0c;所以他們不會以分號(;)結尾。 #define預處理 #define預處理指令用于創…

C++信號處理

信號是由操作系統傳給進程的中斷&#xff0c;會提早終止一個程序。在UNIX、LINUX、Mac OS或windows系統上&#xff0c;可以通過按Ctrlc產生中斷。有些信號不能被程序捕獲&#xff0c;但是下表所列信號可以在程序中被捕獲&#xff0c;并可以基于信號采取適當的動作。這些信號是定…

Python—“helloworld”

接觸一門計算機新語言&#xff0c;第一件事就是要準備好一個編譯器用來打代碼。 網上很多環境搭建的方法&#xff0c;具體參照https://www.runoob.com/python/python-install.html 由于我之前一直在使用Ubuntu的gcc編譯&#xff0c;恰好也可以運行python程序&#xff0c;我也就…

創建線程

pthread_self函數 獲取線程ID。其作用對應進程中 getpid() 函數。 pthread_t pthread_self(void); 返回值&#xff1a;成功&#xff1a;0&#xff1b; 失敗&#xff1a;無&#xff01; 線程ID&#xff1a;pthread_t類型&#xff0c;本質&#xff1a;在Linux下為無符號…

C/C++頭文件

C/C頭文件一覽C、傳統 C#include <assert.h> //設定插入點#include <ctype.h> //字符處理#include <errno.h> //定義錯誤碼#include <float.h> //浮點數處理#include <fstream.h> //文件輸入&#xff0f;輸出#include <iomanip.h> //參數化…