1. 程式人生 > >kill 與 raise 函式

kill 與 raise 函式

1. 函式說明:

kill和raise是用來發送訊號的:

kill把訊號傳送給程序或程序組;

raise把訊號傳送給(程序)自身.

他們的原型如下:

#include <signal.h>int kill(pid_t pid, int signo);
int raise(int
 signo);

成功則返回0, 出錯則返回
-1

 從原型上可以看出, raise函式是可以通過kill實現的.

raise(signo);

等價於:

kill(getpid(), signo);

2. pid引數:

kill函式中的pid引數, 它有以下4種情況:

  • pid > 0: 將該訊號傳送給程序ID為pid的程序.
  • pid == 0: 將該訊號傳送給與傳送程序屬於同一程序組的所有程序(不包括核心程序和init程序). 此時, 傳送程序必須具有向這些程序傳送訊號的許可權.
  • pid < 0: 將該訊號發給其程序組ID等於pid絕對值的所有程序(不包括核心程序和init程序). 此時, 傳送程序必須具有向這些程序傳送訊號的許可權.
  • pid == -1: 將該訊號傳送給傳送程序有許可權向它們傳送訊號的系統上的所有程序.(不包括核心程序和init程序).

3. signo引數:

POSIX.1將編號為0的訊號定義為空訊號. 如果signo引數是0, 則kill仍執行正常的錯誤檢查, 但不傳送訊號. 這被用來確定一個程序是否存在.

4. 例子說明

返回值說明: 成功執行時,返回0。失敗返回-1,errno被設為以下的某個值 EINVAL:指定的訊號碼無效(引數 sig 不合法) EPERM;許可權不夠無法傳送訊號給指定程序 ESRCH:引數 pid 所指定的程序或程序組不存在

程式碼  1 #include <sys/wait.h> 2 #include <sys/types.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <signal.h> 6  7 int main( void )
 8
 {
 9     pid_t childpid;
10 int status;
11 int retval;
12 13     childpid = fork();
14 if ( -1 == childpid )
15     {
16         perror( "fork()" );
17         exit( EXIT_FAILURE );
18     }
19 else if ( 0 == childpid )
20     {
21         puts( "In child process" );
22         sleep( 100 );//讓子程序睡眠,看看父程序的行為23         exit(EXIT_SUCCESS);
24     }
25 else26     {
27 if ( 0 == (waitpid( childpid, &status, WNOHANG )))
28         {
29             retval = kill( childpid,SIGKILL );
30 31 if ( retval )
32             {
33                 puts( "kill failed." );
34                 perror( "kill" );
35                 waitpid( childpid, &status, 0 );
36             }
37 else38             {
39                 printf( "%d killed\n", childpid );
40             }
41 42         }
43     }
44 45     exit(EXIT_SUCCESS);
46 }
47 //-----------------48 [[email protected] src]# gcc killer.c
49 [[email protected] src]# ./a.out50 In child process
51 4545 killed

在確信fork呼叫成功後,子程序睡眠100秒,然後退出。
同時父程序在子程序上呼叫waitpid函式,但使用了WNOHANG選項(WNOHANG如果沒有任何已經結束的子程序則馬上返回,不予以等),
所以呼叫waitpid後立即返回。父程序接著殺死子程序,如果kill執行失敗,
返回-1,否這返回0。如果kill執行失敗,父程序第二次呼叫waitpid,
保證他在子程序退出後再停止執行。否則父程序顯示一條成功訊息後退出。


相關推薦

kill raise 函式

1. 函式說明: kill和raise是用來發送訊號的: kill把訊號傳送給程序或程序組; raise把訊號傳送給(程序)自身. 他們的原型如下: #include <signal.h>int kill(pid_t pid, int signo);int raise(int signo);

三十一、Linux 程序訊號——SIGCHLD 訊號、killraise函式以及alarm函式

31.1 SIGCHLD 訊號 子程序狀態發生變化(子程序結束)產生該訊號,父程序需要使用 wait 呼叫來等待子程序結束並回收它。 避免殭屍程序 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include

關於killsignal函式

kill()與signal實際上是一套訊號的發射與接受 kill命令在初學時,習慣上用作殺死程序 但是實際上kill函式的功能是傳送訊號給程序 (終止程序的時候傳送SIGTERM訊號) 標頭檔案 #include <signal.h> (#include <sys/ty

Linux Signal (6): 傳送訊號的killraise 函式

1. 函式說明: kill和raise是用來發送訊號的: kill把訊號傳送給程序或程序組,它不僅可以中止程序,也可以向程序傳送其他訊號; raise把訊號傳送給(程序)自身. 它們的原型如下: #include <signal.h> #include <s

11.訊號相關函式killraise;abort;alarm;setitimer

1.kill;raise;abort 1.kill--傳送訊號給指定程序:int kill(pid_t pid, int sig); pid>0:發訊號給指定的程序 pid=0:呼叫kill函式的程序的(同一組的所有程序) pid<-1:取|p

訊號 09 | 函式killraise

分析: #include<signal.h> int kill(pid_t pid, int signo); //signo:訊號名 int raise(int signo) 兩個函式返回值:若成功,返回

《UNIX環境高階程式設計》筆記--kill函式raise函式,alarm函式,pause函式

1.kill函式和raise函式 kill函式將訊號傳送給程序或者程序組,raise函式則執行程序向自身傳送訊號。 #include <signal.h> int kill(pid_t pid,int signo); int raise(int signo);

linux獲取jmeter PID並且kill啟動

ash pidof too awk 區別 執行 自身 通過 sleep Linux 的交互式 Shell 與 Shell 腳本存在一定的差異,主要是由於後者存在一個獨立的運行進程,因此在獲取進程 pid 上二者也有所區別。 交互式 Bash Shell 獲取進程 pid

彙編函式c函式互相呼叫問題

彙編函式與c函式的互相呼叫問題 從函式定義的角度來看,彙編函式與c函式都是執行流的基本單位,兩者沒有太大的區別。從操作物件來看,彙編函式中的指令都是直接操作暫存器完成的,c函式中的語句是通過操作變數(可能在暫存器中,大部分時間中都在記憶體中例如ram、cache)。 從c函式調用

MySQLOracle函式對照

MySQL的:從NULL轉換(相當於NVL在Oracle中) 一、對應到Oracle的NVL與MySQL的功能是“IFNULL” 選擇IFNULL(null_field,'A'); ----------------------- Tasu

交叉熵softmax函式

交叉熵與softmax函式 在神經網路中,在對超引數進行優化過程當中,需要有一個優化的目標值,也就是真實值與預測值之間的差距要儘量小,差距越小說明預測越精確。這個差距往往用loss表示 在分類問題當中,我們用交叉熵來表示這個loss值。 1. 熵的概念 熵是物理學中的一個名詞

訊號函式

1、簡單介紹一下訊號和槽:大家可以把它們都看做是函式,比如這裡,當單擊了按鈕以後就會發射單擊訊號,即clicked();然後對話方塊接收到訊號就會執行相應的操作,即執行accept()槽。一般情況下,我們只需要修改槽函式即可,不過,這裡的accept()已經實現了預設的功能,它會將對話方塊關閉並返回

C++學習筆記 (六) ---- 多型虛擬函式

①、多型的概念 先上一個示例 #include <iostream> using namespace std; //基類People class People{ public: People(char *name, int age); void display(

numpy 辨異—— numpy.ravel() vs numpy.flatten() squeeze()函式

numpy.ravel() vs numpy.flatten() 首先宣告兩者所要實現的功能是一致的(將多維陣列降位一維),兩者的區別在於返回拷貝(copy)還是返回檢視(view),numpy.flatten()返回一份拷貝,對拷貝所做的修改不會影響(reflects)原始矩陣,而nump

java 筆記 this關鍵字建構函式

public String toString() { return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", sal=" + sal + "]"; } public Em

派生類的建構函式和解構函式和多繼承中的二義性虛擬函式

解構函式主要作用是對資料成員初始化。 1派生類的建構函式 派生類的建構函式定義的一般形式為: 派生類名::派生類名(基類所需形參,本類成員所需形參):基類1(基類1 引數表),基類2(基類2 引數表),···,基類n(基類n 引數表),物件成員1(物件1 引數表),物件成員2(物件2 引

Python分隔字串re.splitsplit函式

split:多個分隔符 單一分隔符,使用str.split()即可  re.split:多個分隔符,複雜的分隔情況(用|隔開) 單一分隔符,str.split()與 re.split()效果是一樣的 多個單一 分隔符 時 ,”[]”與 “|”的 效果是一樣的,但是 請注意 使

資料分組聚合函式

到目前為止我們使用的聚合函式都是對普通結果集進行統計的,我們同樣可以使用聚合函式來對分組後的資料進行統計,也就是統計每一個分組的資料。我們甚至可以認為在沒有使用GROUP BY語句中使用聚合函式不過是在一個整個結果集是一個組的分組資料中進行資料統計分析罷了。 讓我們來看一下“檢視每個年齡段的員工的人數”如何

SQL字元函式數值函式

字元函式 1、轉換大小寫 UPPER(列|字串):將字串的內容全部大寫 LOWER(列字串):將字串的內容全部小寫 SELECT UPPER(‘zhixu’),LOWER(‘ZHIXU’) FROM dual ; SELECT LOWER(ENAME) FROM EMP ; 一列資訊變為小寫

演算法導論 第三章:函式的增長 筆記(Θ記號、O記號、Ω記號、o記號、ω記號、漸近記號的性質、標準記號常用函式

Θ記號: 該記號圓圈中是個M。Θ記號漸近地給出一個函式的上界和下界。 對於一個給定的函式g(n),我們用Θ(g(n))來表示以下函式的集合: Θ(g(n))={f(n):存在正常量c1、c2和n0,使得對於所有n⩾n0,有0⩽c1g(n)⩽f(n)⩽c2g(n)}。 即若存在正常