【信號】函數kill、raise、abort、alarm

一、函數kill

1. kill函數原型:

int kill(pid_t pid, int signo);  //signo:信號名

分析

  • pid? > 0: 發送信號給指定的進程
  • pid = 0: 發送信號給調用kill函數進程屬于同一個進程組的所有進程
  • pid < 0:信號signo將發送給進程組= -pid中的每一個進程。
  • pid? = -1:發送給有權限發送的系統中所有進程。

注意

  • 進程組:每個進程都屬于一個進程組,進程組是一個或多個進程的集合, 它們相互關聯,共同完成一個實體任務。每個進程組都有一個進程組長,默認進程組ID與進程組長ID相同。
  • 權限保護:super用戶(root)可以發送信號給任意用戶,普通用戶不能像系統發送信號的,kill -9(root用戶的pid)是不可以的,同樣,普通用戶也不能向其他普通用戶發送信號,終止進程。只能向自己進程發送信號,普通的用戶基本規則:發送者實際或有效用戶ID == 接受者實際或有效用戶ID

?

2. 測試代碼:

#include <unistd.h> 
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>void handler(int sig)
{printf("recv a sig = %d\n", sig);
}int main(int argc, char* argv[])
{if (signal(SIGUSR1, handler) == SIG_ERR){perror("signal error");exit(1);}pid_t pid = fork();if (pid == -1){perror("fork error");exit(1);}if (pid == 0){kill(getppid(), SIGUSR1);exit(1);}int n = 5;do{n = sleep(n);} while (n > 0);return 0;
}

輸出結果:

?

?

2. 測試代碼:

#include <unistd.h> 
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>void handler(int sig)
{printf("recv a sig = %d\n", sig);
}int main(int argc, char* argv[])
{if (signal(SIGUSR1, handler) == SIG_ERR) {perror("signal error");exit(1);}pid_t pid = fork();if (pid == -1) {perror("fork error");exit(1);}if (pid == 0){pid = getpgrp();kill(-pid, SIGUSR1);exit(1);}int n = 5;do {n = sleep(n);} while (n > 0);return 0;
}

輸出結果:

?

?

二、函數raise

int raise(int signo); //signo:信號名

分析:

  • 給當前進程發送指定信號(自己給自己發)raise(signo) == kill(getpid(), signo))

?

三.、函數abort

1. abort函數原型

void abort(void);

分析:

  • 給自己發送異常終止信號? 6) SIGABRT信號,終止并產生core文件

?

四、函數alarm

1. 簡介
設置定時器(鬧鐘)。在指定seconds后,內核會給當前進程發送 14)SIGALRM信號,進程收到信號后,默認動作終止。

每個進程都有且只有唯一個定時器。

2. alarm函數原型:

unsigned int alarm(unsigned int seconds);
  • 常用:取消定時器alarm(0);返回剩余秒數。
  • 例如:alarm(5) -> 3sec? -> alarm(4)??返回2秒 ->??5sec ->?alam(5) ->? alam(0)??返回5秒

定時,與進程狀態無關(自然定時法) !就緒、運行、掛起(阻塞、暫停)、終止、僵尸等等,無論進程處于何種狀態,alarm都計時。

?

五、函數pause

1. pasue函數原型

調用該函數可以造成進程主動掛起,等待信號喚醒,調用該系統調用的進程處于阻塞狀態(主動放棄CPU)直到有信號遞達將其喚醒。

int pause(void);

返回值:

  • 如果信號的默認處理動作是終止進程,則進程終止,pause函數沒有機會返回。
  • 如果信號的默認動作是忽略,進程繼續處于掛起狀態,pause函數不返回
  • 如果信號的處理動作是捕捉,則【調用完信號處理函數之后,pause返回-1】errno設置為EINTR,表示“被信號中斷”
  • pause收到的信號不能屏蔽,如果被屏蔽,那么pause就不能被喚醒。
  • 將進程置為可中斷睡眠狀態。然后?它調用schedule(),使linux進程調度器找到另一個進程來運行。
  • pause使調用者進程掛起,直到一個信號被捕捉。

?

2. 測試代碼?

#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)
{int ret;struct sigaction act, oldact;act.sa_handler = catch_sigalrm;sigemptyset(&act.sa_mask);act.sa_flags = 0;ret = sigaction(SIGALRM, &act, &oldact);if(ret == -1) {perror("sigaction error");exit(1);}alarm(seconds); ret = pause();  //主動掛起,等待信號if(ret == -1 && errno == EINTR) {printf("pause sucess\n");}ret = alarm(0); //防止異常產生sigaction(SIGALRM, &oldact, NULL);//恢復AIGALRM信號舊有的處理方式return ret;
}int main()
{while(1) {mysleep(3);printf("----------------------------\n");}return 0;
}

?

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

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

相關文章

三面美團Java崗,尚學堂java馬士兵全套

SpringBoot經典之作 進入Spring Boot世界 準備開發環境搭建開發工具 基礎 Spring Boot基礎分層開發Web應用程序響應式編程 進階 Spring Boot進階用ORM操作SQL數據庫接口架構風格——RESTful集成安全框架&#xff0c;實現安全認證和授權集成Redis&#xff0c;實現高并發集成R…

信號 09 | 信號概念

信號的概念 信號在我們的生活隨處可見&#xff0c;如&#xff1a;古代戰爭中摔杯為號&#xff1b;代戰爭中的信號彈&#xff1b;體育比賽中使用的信號槍&#xff0c;它們都有共性&#xff1a;1. 簡單 2. 不能攜帶大量的信息 3. 滿足某個特定條件才發送 信號是信息的載體&…

一招徹底幫你搞定HashMap源碼,項目實戰

ES 集群架構演進之路 1、初始階段 訂單中心ES初始階段如一張白紙&#xff0c;架設方案基本沒有&#xff0c;很多配置都是保持集群默認配置。整個集群部署在集團的彈性云上&#xff0c;ES集群的節點以及機器部署都比較混亂。同時按照集群維度來看&#xff0c;一個ES集群會有單…

【信號】信號集、sigprocmask、sigpending

一、信號集操作函數 內核通過讀取未決信號集來判斷信號是否應被處理。信號屏蔽字mask可以影響未決信號集。而我們可以在用程序自定義set來改變mask&#xff0c;來達到屏蔽指定信號目的。 sigset_t set; // typedef unsigned long sig…

一招讓你拿下seata分布式事務框架,看這篇文章準沒錯!

第一階段&#xff1a;架構師筑基必備技能 我覺得&#xff0c;但凡是個成年人應該都清楚扎實的基本功對自己的工作幫助有多重要。從各大招聘網站的招聘要求來看&#xff0c;第一條都明確說明需要扎實的Java基礎。因此&#xff0c;一般筆試以及面試的第一輪&#xff0c;對基礎的…

函數signal、sigaction

二、函數sigaction 修改信號處理動作(通常在Linux用來注冊一個信號的捕捉函數) #inlcude<signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 參數&#xff1a; act&am…

一文了解OOM及解決方案,你還看不明白?

InnoDB總體結構 首先我們來看官網的一張圖(圖片來源于MySQL官網)&#xff1a; 從上圖中可以看出其主要分為兩部分結構&#xff0c;一部分為內存中的結構(上圖左邊)&#xff0c;一部分為磁盤中的結構(上圖右邊) 內存結構 InnoDB內存中的結構主要分為&#xff1a;Buffer Pool,…

信號 09 | 函數pause

函數pause 調用該函數可以造成進程主動掛起&#xff0c;等待信號喚醒&#xff0c;調用該系統調用的進程處于阻塞狀態(主動放棄CPU)直到有信號遞達將其喚醒。 將進程置為可中斷睡眠狀態。然后 它調用schedule()&#xff0c;使linux進程調度器找到另一個進程來運行。pause使調用…

一文搞懂JVM架構和運行時數據區,全網最新

1.Java基礎面試知識點 Java中和equals和hashCode的區別int、char、long各占多少字節數int與integer的區別探探對Java多態的理解String、StringBuffer、StringBuilder區別什么是內部類&#xff1f;內部類的作用抽象類和接口區別抽象類的意義抽象類與接口的應用場景抽象類是否可…

一條正確的Java職業生涯規劃,幫你突破瓶頸

面試題模塊介紹&#xff1a; 一、Java 基礎 JDK 和 JRE 有什么區別&#xff1f; 和 equals 的區別是什么&#xff1f;兩個對象的 hashCode()相同&#xff0c;則 equals()也一定為 true&#xff0c;對嗎&#xff1f;final 在 java 中有什么作用&#xff1f;java 中的 Math.roun…

【線程】線程基本函數

一、pthread_self函數 功能&#xff1a;獲取線程ID。 pthread_t pthread_self(void); 線程ID&#xff1a;pthread_t類型&#xff0c;本質&#xff1a;在Linux為無符號整數(%lu)&#xff0c;其他系統可能是結構體實現線程ID是進程內部識別標志。&#xff08;兩個進程間&#…

一條正確的Java職業生涯規劃,順利通過阿里Java崗面試

珍藏版&#xff08;1&#xff09;——Mybatis入門 1.什么是MyBatis 2.為什么我們要用Mybatis? 3.Mybatis快速入門 3.1 導入開發包 3.2準備測試工作 3.3 創建mybatis配置文件 3.4 編寫工具類測試是否獲取到連接 3.5 創建實體與映射關系文件 3.6 編寫DAO 4.Mybatis工作…

線程控制 12 | 線程屬性

本節作為指引性介紹&#xff0c;linux下線程的屬性是可以根據實際項目需要&#xff0c;進行設置&#xff0c;之前我們討論的線程都是采用線程的默認屬性&#xff0c;默認屬性已經可以解決絕大部分開發遇到的問題。如我們對程序的性能提出更高的要求那么需要設置線程屬性&#x…

一次違反常規的Java大廠面試經歷,系列教學

第一部分 Java相關以及答案 答案 第二部分算法跟編程 第三部分html&JavaScript&ajax部分 答案 第四部分Javaweb部分 答案 第五部分數據庫部分 答案 第六部分XML部分 答案 第七部分.流行的框架與新技術 答案 第八、九部分.軟件工程與設計模式以及j2ee部分 最后 筆者…

函數perror、strerror

perror函數 函數原型&#xff1a; #include<stdio.h> void perror(const char *msg); 測試代碼&#xff1a; #include<unistd.h> #include<errno.h> #include<stdio.h>int main() {int ret;ret close(10);if(ret -1) {perror("close error…

一次違反常規的Java大廠面試經歷,重難點整理

目錄 Kafka的基本介紹Kafka的設計原理分析Kafka數據傳輸的事務特點Kafka消息存儲格式副本&#xff08;replication&#xff09;策略Kafka消息分組&#xff0c;消息消費原理Kafak順序寫入與數據讀取消費者&#xff08;讀取數據&#xff09; Kafka的基本介紹 Kafka是最初由Lin…

一步搞定你疑惑的數據結構與算法系列,原理+實戰講解

螞蟻金服一面&#xff1a; 下午杭州的電話&#xff0c;問有沒有空&#xff0c;果斷有空&#xff0c;雖然感覺略顯緊張&#xff0c;有點懵逼。 面試的題目&#xff1a; HashMap和Hashtable的區別實現一個保證迭代順序的HashMap說一說排序算法&#xff0c;穩定性&#xff0c;復…

互斥量(互斥鎖)

一、互斥量mutex Linux提供一把互斥鎖mutex(也稱之為互斥量)每個線程在對資源操作前都嘗試先加鎖&#xff0c;成功加鎖才能操作&#xff0c;操作結束后解鎖。資源還是共享的&#xff0c;線程間也還是競爭的&#xff0c;但通過鎖將資源的訪問變為互斥操作&#xff0c;而后與時間…

一眼就能看懂的Java自學手冊,終局之戰

珍藏版&#xff08;1&#xff09;——Mybatis入門 1.什么是MyBatis 2.為什么我們要用Mybatis? 3.Mybatis快速入門 3.1 導入開發包 3.2準備測試工作 3.3 創建mybatis配置文件 3.4 編寫工具類測試是否獲取到連接 3.5 創建實體與映射關系文件 3.6 編寫DAO 4.Mybatis工作…

Centos 6.x

1. centos升級gcc教程&#xff1a;鏈接 2. 虛擬機中的Centos聯通網絡&#xff1a;鏈接 3. 虛擬機安裝Centos7系統教程&#xff1a;鏈接