函數sigsuspend

?

1. 測試代碼:
?

#include<stdio.h>
#include<stdlib.h>
#include<signal.h>
#include<errno.h>
#include<unistd.h>void catch_sigalrm(int signo)
{;
}unsigned int mysleep(unsigned int seconds)
{struct sigaction newact, oldact;sigset_t newmask, oldmask, suspmask;unsigned int unmask;//1. 為SIGALRM設置捕捉函數,一個空函數newact.sa_handler = sig_alrm;sigemptyset(&newact.sa_mask);newact.sa_flags = 0;sigaction(SIGALRM, &newact, &oldact);// 2. 設置阻塞信號集,阻塞SIGLARM信號sigemptyset(&newmask);sigaddset(*newact.sa_mask, SIGALRM);sigpromask(SIG_BLOCK, &newact, &oldact);   //信號屏蔽字// 3、定時h秒,到時可以產生SIGALRM信號alarm(nsecs);/* 4. 構造一個調用sigsuspend臨時有效的阻塞信號集,*   臨時阻塞信號集里面解除SIGALRM的阻塞*/suspmask = oldmask;sigdelset(&suspmask, SIGALRM);/* 5. sigsuspend調用期間,采用臨時阻塞信號集suspmask替換原有阻塞信號集*   這個信號集中不包含SIGALRM信號,同時掛起等待*   當sigsuspend被信號喚醒返回時,恢復原有的阻塞信號集*/sigsuspend(&suspmask);unslept = alarm(0);//6. 恢復SIGALRM原有的處理動作,呼應前面注釋1sigaction(SIGLARM, &oldact, NULL);//7. 解除對SIGALRM的阻塞,呼應前面注釋2 sigprocmask(SIG_SETMASK, &oldmask, NULL);return (unslept);
}int main()
{while (1) {mysleep(3);printf("----------------------------\n");}return 0;
}

?

2. 測試代碼:

#include <unistd.h> 
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>int n = 0, flag = 0;void sys_err(char *str)
{perror(str);exit(1);
}void do_sig_child(int num)
{printf("I am child %d\t%d\n", getpid(), n);n += 2;flag = 1;sleep(1);
}void do_sig_parent(int num)
{printf("I am parent %d\t%d\n", getpid(), n);n += 2;flag = 1; //數數完成 sleep(1);
}int main(void)
{pid_t pid;struct sigaction act;if ((pid = fork()) < 0)sys_err("fork");else if (pid > 0) {n = 1;sleep(1);act.sa_handler = do_sig_parent;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGUSR2, &act, NULL); //祖冊自己的信號捕捉函數 父用SIGUSR2信號 do_sig_parent(0);while (1) {/* wait for signal*/if (flag == 1) {kill(pid, SIGUSR1);  //父進程數數完成flag = 0;            //標志已經給子進程發送信號完信號 }}}else if (pid == 0) {n = 2;act.sa_handler = do_sig_child;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGUSR1, &act, NULL);while (1) {/* wait for signal*/if (flag == 1) {kill(getppid(), SIGUSR2);flag = 0;           //標志已經給父進程發送信號了 }}}return 0;
}

測試代碼:

#include <unistd.h> 
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>int n = 0, flag = 0;void sys_err(char *str)
{perror(str);exit(1);
}void do_sig_child(int num)
{printf("I am child %d\t%d\n", getpid(), n);n += 2;flag = 1;// sleep(1);
}void do_sig_parent(int num)
{printf("I am parent %d\t%d\n", getpid(), n);n += 2;flag = 1; //數數完成 //sleep(1);
}int main(void)
{pid_t pid;struct sigaction act;if ((pid = fork()) < 0)sys_err("fork");else if (pid > 0) {n = 1;sleep(1);act.sa_handler = do_sig_parent;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGUSR2, &act, NULL); //祖冊自己的信號捕捉函數 父用SIGUSR2信號 do_sig_parent(0);while (1) {/* wait for signal*/if (flag == 1) {kill(pid, SIGUSR1);  //父進程數數完成flag = 0;            //標志已經給子進程發送信號完信號 }}}else if (pid == 0) {n = 2;act.sa_handler = do_sig_child;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGUSR1, &act, NULL);while (1) {/* wait for signal*/if (flag == 1) {kill(getppid(), SIGUSR2);flag = 0;           //標志已經給父進程發送信號了 }}}return 0;
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385556.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385556.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385556.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java支付模塊架構,漲薪7K!

Java基礎 JDK 和 JRE 有什么區別&#xff1f; 和 equals 的區別是什么&#xff1f;兩個對象的 hashCode()相同&#xff0c;則 equals()也一定為 true&#xff0c;對嗎&#xff1f;final 在 java 中有什么作用&#xff1f;java 中的 Math.round(-1.5) 等于多少&#xff1f;Stri…

【信號】SIGCHLD信號

一、SIGCHLD信號 1. SIGCHLD簡介 SIGCHLD的產生條件&#xff1a; 子進程終止子進程接收到SIGSTOP信號停止時子進程處于停止狀態&#xff0c;接收到SIGCONT后喚醒注意&#xff1a;通過signal(SIGCHLD, SIG_IGN)通知內核對子進程的結束不關心&#xff0c;由內核回收。如果不想讓…

java改錯題技巧,看這篇文章準沒錯!

阿里 mq 消息可靠性,冪等如何保證分布式鎖的實現方案比較,為什么選擇 zookeeper, zookeeper 一致性協議原理線程池參數,阻塞隊列實現一致性 Hash解決什么問題, 如何實現? 虛擬節點的作用?Java 鎖的實現方式, 比較? AQS實現原理?公平非公平實現原理?CAS 實現原理volatile 實…

函數stat、fstat、fstatat和lstat

一、主要函數應用 #include <sys/stat.h> int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf) int lstat(const char *path, struct stat *buf); int fstat(int fd, const char *path, struct stat *buf, int flag);參數&#xff1a;…

java教程pdf下載百度云,面試題+筆記+項目實戰

一面問題&#xff1a;MySQLRedisKafka線程算法 mysql知道哪些存儲引擎&#xff0c;它們的區別mysql索引在什么情況下會失效mysql在項目中的優化場景&#xff0c;慢查詢解決等mysql有什么索引&#xff0c;索引模型是什么B-樹與B樹的區別&#xff1f;為什么不用紅黑樹mysql主從同…

函數mkdir、mkdirat和emdir

一、目錄的權限位 目錄的權限位&#xff0c;至少要設置一個執行許可位。即 rwx 中的那個 x 位。如果不設置&#xff0c;就沒辦法使用 cd 命令進入目錄&#xff0c;也無法讀取目錄下的文件內容。所以&#xff0c;這個位是必須的。目錄的寫權限位。如果未設置寫權限位(w 位)&…

java教程傳智播客,面試真題解析

01 阿里中間件&#xff08;四面&#xff0c;Java崗&#xff09; 1.1 Java中間件一面 技術一面考察范圍 重點問了Java線程鎖&#xff1a;synchronized 和ReentrantLock相關的底層實現 線程池的底層實現以及常見的參數 數據結構基本都問了一遍&#xff1a;鏈表、隊列等 Java內存…

函數chdir和get

摘要&#xff1a; chdir 這個命令類似于 linux 的命令 cd&#xff0c;而 getcwd 有點像 pwd。 函數原型&#xff1a; #include <unistd.h> int chdir(const char *path); char *getcwd(char *buf, size_t size); 當前工作目錄 當前工作目錄是針對進程而言的&#xff0…

java教程百度文庫,成功拿到offer

正文 現在市面上的算法資料也五花八門&#xff0c;種類繁多&#xff0c;小編也整理了一份不同于市面且有意思的算法資料&#xff0c;不能說多全面&#xff0c;但是是小編花了很長時間整理歸納出來的&#xff0c;自我感覺還行。分享給同事及群里反響都不錯&#xff0c;所以小編…

link系列函數

摘要&#xff1a; 圖解符號鏈接和硬鏈接的區別和i節點的介紹 二、link函數 link 函數專門用來創建硬鏈接的&#xff0c;功能和 ln 命令一樣。它主要做兩件事&#xff1a;1) 創建一個目錄項 2) inode 結構體引用計數加 1。這兩步是一個原子操作&#xff0c;要么全部失敗&#…

java數字排序代碼,進階加薪全靠它!

數據庫 2.1 池化技術&#xff1a;如何減少頻繁創建數據庫連接的性能損耗&#xff1f;2.2 數據庫優化方案&#xff08;一&#xff09;&#xff1a;查詢請求增加時&#xff0c;如何做主從分離&#xff1f;2.3 數據庫優化方案&#xff08;二&#xff09;&#xff1a;寫入數據量增…

函數umask

umask函數原型&#xff1a; #include <sys/stat.h> mode_t umask(mode_t mask); 分析&#xff1a; 在進程創建一個新的文件或目錄時&#xff0c;如調用open函數創建一個新文件&#xff0c;新文件的實際存取權限是mode與umask按照 mode&~umask運算以后的結果。umask…

java數據分析庫,威力加強版

美團技術一面20分鐘 晚7點&#xff0c;因為想到下周一才面試&#xff0c;我剛準備出去打個羽毛球&#xff0c;北京的電話就來了。面試官各種抱歉&#xff0c;說開會拖延了。 1、自我介紹 說了很多遍了&#xff0c;很流暢撿重點介紹完。 2、問我數據結構算法好不好 挺好的&…

函數chown

一、chown 命令 下面以實例簡單講解下 chown 的使用方法。當前登錄的賬號是 sunbin 創建測試文件當前 test.txt 文件所有者是sunbin&#xff0c;所屬組也是sunbin。 利用 chown 命令修改 test.txt 的所有者和所屬組.可以看到&#xff0c;test.txt 的擁有者變成了 root&#…

不愧是Alibaba技術官,java數組實現單向鏈表

緩存雪崩 緩存雪崩指的是Redis當中的大量緩存在同一時間全部失效&#xff0c;而假如恰巧這一段時間同時又有大量請求被發起&#xff0c;那么就會造成請求直接訪問到數據庫&#xff0c;可能會把數據庫沖垮。 緩存雪崩一般形容的是緩存中沒有而數據庫中有的數據&#xff0c;而因…

【線程】讀寫鎖

一、概念 一把讀寫鎖具備三種狀態&#xff1a; 讀模式下加鎖狀態(讀鎖&#xff09;寫模式下加鎖轉態(寫鎖)不加鎖狀態2. 讀寫鎖特性&#xff1a; 讀寫鎖是寫模式加鎖時&#xff0c;解鎖前&#xff0c;所有對該鎖加鎖的線程都會阻塞。讀寫鎖是讀模式加鎖時&#xff0c;如果線程以…

不愧是阿里大佬,mysql存儲過程寫法案例

容器化時代來了 虛擬化技術已經走過了三個時代&#xff0c;沒有容器化技術的演進就不會有 Docker 技術的誕生。 虛擬化技術演進 &#xff08;1&#xff09;物理機時代&#xff1a;多個應用程序可能會跑在一臺機器上。 &#xff08;2&#xff09;虛擬機時代&#xff1a;一臺物…

讀寫鎖(二)

一、實驗項目 【問題描述】程序 trainticket 中&#xff0c;有 100 個線程&#xff0c;其中 90 個線程是查余票數量的&#xff0c;只有 10 個線程搶票&#xff0c;每個線程一次買 10 張票。初始狀態下一共有 1000 張票。因此執行完畢后&#xff0c;還會剩下 900 張票。 程序 …

不看絕對血虧!java字符串轉json

一、對Kafka的認識 1.Kafka的基本概念 2.安裝與配置 3.生產與消費 4.服務端參數配置 二、生產者 1.客戶端開發 必要的參數配置消息的發送序列化分區器生產者攔截器 2.原理分析 整體架構元數據的更新 3.重要的生產者參數 三、消費者 1.消費者與消費組 2.客戶端開發 必要的…

【線程】屏障

一、主要函數應用 1. 函數原型&#xff1a;初始化和回收 int pthread_barrier_init(pthread *barrier, const pthread_barrier_t *attr, unsigned int count); int pthread_barrier_destroy(pthread_barrier_t *barrier);分析&#xff1a; 初始化屏障時&#xff0c;可以使用c…