中斷的系統調用

系統調用可分為兩類:慢速系統調用和其他系統調用

  • 慢速系統調用:可能會使進程永遠阻塞的一類,如果在阻塞期間收到一個信號,該系統調用就被中斷,不再繼續執行(早期);也可以設定系統調用是否重啟。如:read、write、pause、wait等等
  • 其他系統調用:getpid、getppid、fork...

結合pause,回顧慢速系統調用:

  • 想中斷pause,信號不能被屏蔽
  • 信號的處理方式必須是捕捉(默認、忽略都不可以)
  • 中斷后返回-1,設置errno為EINTR(表“被信號中斷”)

可修改sa_flags參數來設置被信號中斷系統調用是否重啟。SA_INTERRURT 不重啟。SA_RESTART重啟。

擴展了解:

sa_flags還有許多可選參數,適用不同情況,如:捕捉到信號后,在執行捕捉函數期間,不希望屏蔽該信號,可將sa_flags設置為SA_NODEFER,除非sa_mask中包含該信號。

?

1. 測試代碼:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <signal.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>void int_handler(int signum)
{printf("int handler %d\n", signum);
}int main(int argc, char **argv)
{char buf[100];ssize_t ret;struct sigaction oldact;struct sigaction act;act.sa_handler = int_handler;act.sa_flags = 0;act.sa_flags |= SA_RESTART;sigemptyset(&act.sa_mask);if (-1 == sigaction(SIGINT, &act, &oldact)) {printf("sigaction failed!\n");return -1;}bzero(buf, 100);ret = read(STDIN_FILENO, buf, 10);if (ret == -1) {printf("read error %s\n", strerror(errno));}printf("read %d bytes, content is %s\n", (int)ret, buf);sleep(10);return 0;
}

輸出結果:

?

?

2. 測試代碼:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <signal.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>void int_handler(int signum)
{printf("int handler %d\n", signum);
}int main(int argc, char **argv)
{char buf[100];ssize_t ret;struct sigaction oldact;struct sigaction act;act.sa_handler = int_handler;act.sa_flags = 0;// act.sa_flags |= SA_RESTART;sigemptyset(&act.sa_mask);if (-1 == sigaction(SIGINT, &act, &oldact)) {printf("sigaction failed!\n");return -1;}bzero(buf, 100);ret = read(STDIN_FILENO, buf, 10);if (ret == -1) {printf("read error %s\n", strerror(errno));}printf("read %d bytes, content is %s\n", (int)ret, buf);sleep(10);return 0;
}

輸出結果:

?

參考資料

1.?linux SA_RESTART的問題

2.?44-中斷系統調用與自動重啟動

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

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

相關文章

【好文推薦】java模板引擎性能

01. 基礎架構&#xff1a;一條SQL查詢語句是如何執行的&#xff1f; MySQL 的邏輯架構圖 02. 日志系統&#xff1a;一條SQL更新語句是如何執行的&#xff1f; 之前你可能經常聽DBA同事說&#xff0c;MySQL可以恢復到半個月內任意一秒的狀態&#xff0c;驚嘆的同時&#xff0c;…

函數sigqueue

一、函數sigqueue sigqueue函數原型&#xff1a; 函數作用&#xff1a;新的發送信號系統調用&#xff0c;主要是針對實時信號提出的支持信號帶有參數&#xff0c;與函數sigaction&#xff08;&#xff09;配合使用 int sigqueue(pid_t pid, int signo, const union sigval v…

【好文推薦】mysql創建數據庫語句utf-8

性能調優 影響MySQLServer 性能的相關因素 商業需求對性能的影響系統架構及實現對性能的影響Query語句對系統性能的影響Schema設計對系統的性能影響硬件環境對系統性能的影響 MySQL 數據庫鎖定機制 MySQL鎖定機制簡介各種鎖定機制分析合理利用鎖機制優化MySQL MySQL數據庫Qu…

函數setjump和longjmp

一、主要函數應用 函數setjmp 原型&#xff1a; #include <setjmp.h> Int setjmp(jmp_buf env);返回值&#xff1a;若直接調用則返回0&#xff0c;若從longjmp調用返回則返回非0值的longjmp中的val值 分析&#xff1a; 返回值&#xff1a;若直接調用則返回0&#xf…

java接口的定義與實現實驗報告,趕緊收藏備戰金三銀四!

一、對Kafka的認識 1.Kafka的基本概念 2.安裝與配置 3.生產與消費 4.服務端參數配置 二、生產者 1.客戶端開發 2.原理分析 3.重要的生產者參數 三、消費者 1.消費者與消費組 2.客戶端開發 四、主題與分區 1.主題的管理 2.初識KafkaAdminCilent 3.分區的管理 4.如何…

函數sigsetjump和siglongjump

摘要&#xff1a; 在信號處理函數執行時&#xff0c;會阻塞當前信號。當信號處理函數返回時&#xff0c;系統會幫我們把剛剛阻塞的信號再從阻塞集中移除。一、 臨時阻塞特性 當執行信號處理函數的時候&#xff0c;會臨時將當前被處理信號阻塞。為了能說明問題&#xff0c;采用…

java操作word文檔,深度解析,值得收藏

Java虛擬機內存模型 Java虛擬機內存模型中定義的訪問操作與物理計算機處理的基本一致&#xff01; Java中通過多線程機制使得多個任務同時執行處理&#xff0c;所有的線程共享JVM內存區域main memory&#xff0c;而每個線程又單獨的有自己的工作內存&#xff0c;當線程與內存區…

函數sigsuspend

1. 測試代碼&#xff1a; #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, olda…

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…