Linux信号 三 信号发送接口集合
生活随笔
收集整理的這篇文章主要介紹了
Linux信号 三 信号发送接口集合
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
信號發送接口包括raise,kill,killpg,tkill,tgkill,pthread_kill,sigqueue等。
1. raise()
/*** raise用于向進程自身發送信號* 成功返回0,失敗返回非0值,并置errno.* 只有信號處理函數執行完畢之后,raise才能返回。** 對于單線程的程序而言,相當于調用了如下語句:* kill(getpid(), sig);* * 對于多線程的程序而言,相當于調用了如下語句: * pthread_kill(pthread_self(), sig);*/ #include <signal.h> int raise(int sig);?2. kill()
/*** kill函數用于發送信號,不僅可以向特定進程組發送信號,也可以向特定進程發送信號.* 根據參數pid的不同,分為如下幾種情況:* pid > 0, 發送信號給進程ID等于pid的進程。* pid = 0, 發送信號給調用進程所在的同一個進程組的每一個進程。* pid = -1, 有權限向調用進程發送信號的所有進程發送信號,init進程和進程自身除外* pid < -1, 向進程組-pid發送信號。* sig = 0,檢測目標進程或目標進程組是否存在,如果返回-1并且errno為ESRCH表示目標* 或目標進程組不存在。** 成功返回0,失敗返回-1,并置errno**/ #include <sys/types.h> #include <signal.h>int kill(pid_t pid, int sig);3. killpg()
/*** 向進程組發送信號* pgrp = 0,向進程自身所在進程組發送信號。* pgrp <= 1,將引發未定義的行為。** 成功返回0,失敗返回-1并置errno.**/ #include <signal.h> int killpg(int pgrp, int sig);4. tkill() & tgkill()
/** 向線程發送信號* * 這兩個都是內核提供的系統調用,glibc并沒有提供對這兩個系統調用的封裝,如果使用* 這兩個函數,需要采用syscall的方式:* ret = syscall(SYS_tkill, tid, sig);* ret = syscall(SYS_tgkill, tgid, sig);* 成功返回0,失敗返回-1并置errno** tkill是一個過時的接口,并不推薦使用它來向線程發送信號。相比之下,tgkill接口更加* 安全。tgkill系統調用的第一個參數tgid,為線程中主線程的線程ID,或者稱為進程號。* 這個參數能夠起到保護作用,防止向錯誤的線程發送信號。進程ID或線程ID是由內核負責* 管理,進程或線程有自己的生命周期,使用tkill發送信號有可能線程已經退出,這時候會* 將信號發送到不相關的進程上,為了防止出現這種情況,內核引入了tgkill系統調用,* 含義是向線程組ID是tgid、線程ID為tid的線程發送信號,避免發錯信號。* 這兩個函數是Linux特有的,存在一致性問題。**/ int tkill(int tid, int sig); int tgkill(int tgid, int tid, int sig);5. pthread_kill()
/*** 向同一個進程內的線程發送信號** 成功返回0,失敗返回錯誤碼。* 如果sig = 0,將不發送任何信號。* 如果向一個已經退出的線程發送信號,將會引發未定義的行為。比如說段錯誤等。* 編譯的時候加上-pthread選項**/ #include <signal.h> int pthread_kill(pthread_t thread, int sig);6. sigqueue()
/*** 向進程ID等有pid的進程發送信號和數據* 成功返回0,失敗返回-1并置errno* * 第三個參數為伴隨數據,可以向目標進程發送一個整形數據或者指針,當目標進程注冊* 信號處理函數使用了SA_SIGINFO標志位的時候就可以接收到該數據** union sigval {* int sival_int;* void *sival_ptr;* };** 發送sig = 0的信號可以用來檢測目標進程是否存在,返回錯誤碼為ESRCH*** */#include <signal.h> int sigqueue(pid_t pid, int sig, const union sigval value);參考資料:
1. 《Linux環境編程,從應用到內核》高峰,李彬著
2. man signal : http://www.man7.org/linux/man-pages/man7/signal.7.html
總結
以上是生活随笔為你收集整理的Linux信号 三 信号发送接口集合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux信号 二 信号处理函数注册
- 下一篇: Linux信号 四 异步等待信号与同步等