日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux 信号 sigaction(是signal的扩展,在多线程应用中替代了signal)(除了信号值信息外,还可以附加数值信息(以及指针:不可跨进程):sigqueue()函数)

發(fā)布時(shí)間:2025/3/20 linux 37 豆豆

參考視頻教程: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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。