linux 信号 sigaction(是signal的扩展,在多线程应用中替代了signal)(除了信号值信息外,还可以附加数值信息(以及指针:不可跨进程):sigqueue()函数)
參考視頻教程:https://www.bilibili.com/video/BV145411a76x?p=6
另外:Linux多線程詳解(線程的實現、線程回收、線程取消、線程清理,線程信號、線程調試,線程日
貌似發送端除了信號值之外也不能附帶其他自定義的信息啊、、、
參考文章:C - sigaction詳解
LY找了篇文章,貌似確實可以附帶其他信息
參考文章:Linux-C 進程通信之信號 ★★★★★ (這篇文章確實不錯!)
因為sigqueue()聯合體參數中還有個指針變量,難道進程間還能傳遞指針?(因為我試了幾次都不行,傳過去一訪問就報段錯誤了。。)
參考文章:進程間能否傳遞指針?
文章的結論是:只有同一個進程才能傳遞指針。。。
sigaction()和sigqueue()函數
參考文章:Linux-C 進程通信之信號 ★★★★★ (這篇文章確實不錯!)
注:
-
sigaction結構體有帶參處理函數(*sa_sigaction)(可選帶參不帶參,默認不帶參,用act.sa_flags = SA_SIGINFO;設置帶參),帶參處理函數(*sa_sigaction)參數中有siginfo_t*結構體指針,siginfo_t結構體中存儲了大量關于發送端的信息,如si_pid是發送端進程號,si_int是發送端附加的整型數據,si_ptr是附加的指針信息(但貌似不能跨進程使用,只能同進程使用,那么在進程間通信中貌似沒什么用)
-
sigaction()函數負責install(安裝),將需處理信號與sigation結構體實例綁定起來
-
sigqueue()函數負責發送端的信息配置,里面有個參數是聯合體(共用體),可以選擇是帶整型數值(可跨進程),還是帶個泛型指針(不可跨進程)
實例(進程間通信:使用SIGUSR1信號發送自定義整型數值)
接收端:sigaction.c
#include <stdio.h> #include <signal.h> #include <unistd.h> #include <stdlib.h>void sigaction_handle(int signum, siginfo_t *info, void * ucontext) {printf("info.si_pid=%d\n", info->si_pid); //打印信號發送方的pidprintf("info.si_int=%d\n", info->si_int); //打印信號發送方的附加數據//printf("info.si_ptr=%s\n", (char*)(info->si_ptr)); //打印信號發送過來的字符串指針(進程間傳不了指針,段錯誤)//exit(0);}int main(void) {int i;//struct sigaction act, oldact;struct sigaction act;act.sa_flags = SA_SIGINFO;//使用帶參數的信號處理函數act.sa_sigaction = sigaction_handle;//sigemptyset(&act.sa_mask);//清空原來集合//sigfillset(&act.sa_mask);//將所有信號添加到集合//sigaction(SIGUSR1, &act, &oldact);//捕捉sigqueue發送的SIGUSR1信號sigaction(SIGUSR1, &act, NULL);for(i=0; i<1000; i++){printf("i=%d\n", i);sleep(1);}return 0; }發送端:sigqueue.c
#include <stdio.h> #include <signal.h>#include <sys/types.h> //getpid() #include <unistd.h>#include <stdlib.h>int main(int argc, const char *argv[]) {if(argc != 2){printf("arg error\n");return -1;}union sigval value;value.sival_int = 123;//value.sival_int = atoi(argv[2]);//char str[1024] = "fsdfs33";//value.sival_ptr = str; //搞不了,段錯誤int sig_num, pid;sscanf(argv[1], "%d", &pid);sigqueue(pid, SIGUSR1, value);//向指定的pid發送SIGUSR1信號printf("mypid=%d\n", getpid());//打印當前進程的ID號return 0; }交叉編譯在arm攝像頭里跑(ubuntu里跑效果一樣的)
總結
以上是生活随笔為你收集整理的linux 信号 sigaction(是signal的扩展,在多线程应用中替代了signal)(除了信号值信息外,还可以附加数值信息(以及指针:不可跨进程):sigqueue()函数)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: warning: implicit de
- 下一篇: 【B站视频笔记】linux 进程间通信(