linux 信号 sigaction(是signal的扩展,在多线程应用中替代了signal)(除了信号值信息外,还可以附加数值信息(以及指针:不可跨进程):sigqueue()函数)
參考視頻教程:https://www.bilibili.com/video/BV145411a76x?p=6
另外:Linux多線程詳解(線程的實(shí)現(xiàn)、線程回收、線程取消、線程清理,線程信號(hào)、線程調(diào)試,線程日
貌似發(fā)送端除了信號(hào)值之外也不能附帶其他自定義的信息啊、、、
參考文章:C - sigaction詳解
LY找了篇文章,貌似確實(shí)可以附帶其他信息
參考文章:Linux-C 進(jìn)程通信之信號(hào) ★★★★★ (這篇文章確實(shí)不錯(cuò)!)
因?yàn)閟igqueue()聯(lián)合體參數(shù)中還有個(gè)指針變量,難道進(jìn)程間還能傳遞指針?(因?yàn)槲以嚵藥状味疾恍?#xff0c;傳過(guò)去一訪問(wèn)就報(bào)段錯(cuò)誤了。。)
參考文章:進(jìn)程間能否傳遞指針?
文章的結(jié)論是:只有同一個(gè)進(jìn)程才能傳遞指針。。。
sigaction()和sigqueue()函數(shù)
參考文章:Linux-C 進(jìn)程通信之信號(hào) ★★★★★ (這篇文章確實(shí)不錯(cuò)!)
注:
-
sigaction結(jié)構(gòu)體有帶參處理函數(shù)(*sa_sigaction)(可選帶參不帶參,默認(rèn)不帶參,用act.sa_flags = SA_SIGINFO;設(shè)置帶參),帶參處理函數(shù)(*sa_sigaction)參數(shù)中有siginfo_t*結(jié)構(gòu)體指針,siginfo_t結(jié)構(gòu)體中存儲(chǔ)了大量關(guān)于發(fā)送端的信息,如si_pid是發(fā)送端進(jìn)程號(hào),si_int是發(fā)送端附加的整型數(shù)據(jù),si_ptr是附加的指針信息(但貌似不能跨進(jìn)程使用,只能同進(jìn)程使用,那么在進(jìn)程間通信中貌似沒什么用)
-
sigaction()函數(shù)負(fù)責(zé)install(安裝),將需處理信號(hào)與sigation結(jié)構(gòu)體實(shí)例綁定起來(lái)
-
sigqueue()函數(shù)負(fù)責(zé)發(fā)送端的信息配置,里面有個(gè)參數(shù)是聯(lián)合體(共用體),可以選擇是帶整型數(shù)值(可跨進(jìn)程),還是帶個(gè)泛型指針(不可跨進(jìn)程)
實(shí)例(進(jìn)程間通信:使用SIGUSR1信號(hào)發(fā)送自定義整型數(shù)值)
接收端: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); //打印信號(hào)發(fā)送方的pidprintf("info.si_int=%d\n", info->si_int); //打印信號(hào)發(fā)送方的附加數(shù)據(jù)//printf("info.si_ptr=%s\n", (char*)(info->si_ptr)); //打印信號(hào)發(fā)送過(guò)來(lái)的字符串指針(進(jìn)程間傳不了指針,段錯(cuò)誤)//exit(0);}int main(void) {int i;//struct sigaction act, oldact;struct sigaction act;act.sa_flags = SA_SIGINFO;//使用帶參數(shù)的信號(hào)處理函數(shù)act.sa_sigaction = sigaction_handle;//sigemptyset(&act.sa_mask);//清空原來(lái)集合//sigfillset(&act.sa_mask);//將所有信號(hào)添加到集合//sigaction(SIGUSR1, &act, &oldact);//捕捉sigqueue發(fā)送的SIGUSR1信號(hào)sigaction(SIGUSR1, &act, NULL);for(i=0; i<1000; i++){printf("i=%d\n", i);sleep(1);}return 0; }發(fā)送端: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; //搞不了,段錯(cuò)誤int sig_num, pid;sscanf(argv[1], "%d", &pid);sigqueue(pid, SIGUSR1, value);//向指定的pid發(fā)送SIGUSR1信號(hào)printf("mypid=%d\n", getpid());//打印當(dāng)前進(jìn)程的ID號(hào)return 0; }交叉編譯在arm攝像頭里跑(ubuntu里跑效果一樣的)
總結(jié)
以上是生活随笔為你收集整理的linux 信号 sigaction(是signal的扩展,在多线程应用中替代了signal)(除了信号值信息外,还可以附加数值信息(以及指针:不可跨进程):sigqueue()函数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: warning: implicit de
- 下一篇: 【B站视频笔记】linux 进程间通信(