1. 程式人生 > >呼叫訊號處理程式被捕捉的訊號自動地加到程序的當前訊號遮蔽字中signal() sigpending()

呼叫訊號處理程式被捕捉的訊號自動地加到程序的當前訊號遮蔽字中signal() sigpending()

//當呼叫一個訊號處理程式時,被捕捉的訊號自動地加到程序的當前訊號遮蔽字中,阻止後來產生的這種訊號中斷改訊號處理程式。
//當從訊號處理程式返回時,自動恢復原來的遮蔽字

#include <stdio.h>                                                                                                         
#include <signal.h>                                                                                                        
#include <unistd.h>                                                                                                        
                                                                                                                           
sigset_t set;                                                                                                              
                                                                                                                           
void print(int signo)                                                                                                      
{                                                                                                                          
        printf("handle SIGINT in print()!!!\n");                                                                           
}                                                                                                                          
                                                                                                                           
void catch(int signo)                                                                                                      
{                                                                                                                          
        printf("\nin catch()...\n");                                                                                       
        signal(SIGINT, print);                                                                                             
                sleep(5);                                                                                                  
        sigpending(&set);                                                                                                  
        if(sigismember(&set, SIGINT))                                                                                      
                printf("block SIGINT!!!\n");                                                                               
        printf("out catch()...\n");                                                                                        
}                                                                                                                          
                                                                                                                           
int main()                                                                                                                 
{                                                                                                                          
        signal(SIGINT, catch);                                                                                             
        while(1)                                                                                                           
        {                                                                                                                  
                printf("in main()...\n");                                                                                  
                sleep(1);                                                                                                  
        }                                                                                                                  
}  
/*
[email protected]
:~/code/syscall$ ./signal1 in main()... in main()... ^C in catch()... ^C^C^Cblock SIGINT!!! out catch()... handle SIGINT in print()!!! <-如apue所說,解除了該訊號的阻塞後,只會向程序傳送一次該訊號 in main()... in main()... in main()... ^Chandle SIGINT in print()!!! in main()... ^Chandle SIGINT in print()!!! in main()... ^Chandle SIGINT in print()!!! in main()... ^\Quit
[email protected]
:~/code/syscall$ */ //這樣說明了在 訊號處理函式catch中^C被block, //在訊號處理函式catch中的 signal(SIGINT, print)永遠收不到^C


相關推薦

呼叫訊號處理程式捕捉訊號自動程序當前訊號遮蔽signal() sigpending()

//當呼叫一個訊號處理程式時,被捕捉的訊號自動地加到程序的當前訊號遮蔽字中,阻止後來產生的這種訊號中斷改訊號處理程式。 //當從訊號處理程式返回時,自動恢復原來的遮蔽字 #include <stdio.h>

數字訊號處理(MATLAB版)學習筆記1--離散時間訊號與系統

一、週期序列的MATLAB程式設計 1.產生包含x(n)的P行矩陣 2.利用結構( : )將P行連成一個長的行向量。 注:( : )僅對列起作用,所以必須要用矩陣轉置符 '  程式 xtilde = x' * ones(1, P) %P代表x週期,x為一個一週期序列 xti

jq 文字輸入框發生改變時,ajax呼叫一般處理程式,進行判斷

<script> $(document).ready(function () { $("#<%=LoginID_2.ClientID%&g

ajax呼叫一般處理程式的多個方法

js: $.ajax({ url: "ashx/Demo.ashx/", type: "Get", dataType: "json", data: "action=GetData

Js$.ajax呼叫一般處理程式(.ashx)

     $.ajax({                     type: "post",                     url: "/tools/ActApply.ashx",

數字訊號處理公式變程式(四)——巴特沃斯濾波器(上)

之前搞了一些數字訊號處理演算法程式設計(OC),一直沒來得及整理,現在整理一下,包括FFT、巴特沃斯濾波器(高通、低通、帶通、帶阻)、資料差值(線性、sinc、三次樣條*)、資料壓縮(等距、平均、峰值檢測)和模仿matlab的STFT功能(spectrogram函式三維繪圖)。 注:我比較喜歡使

訊號處理函式陷阱:呼叫malloc導致死鎖

    關於訊號處理signal()、sigaction()等的使用,相信很多人都已熟悉。 這裡主要想講一下訊號處理函式使用上的一個常見陷阱:訊號處理函式必須是可重入函式。如果訊號處理函式不可重入,那麼可能導致很多詭異問題。         《UNIX環境高階程式設計》

數字訊號處理公式變程式(一)——DFT、FFT

之前搞了一些數字訊號處理演算法程式設計(OC),一直沒來得及整理,現在整理一下。陸續會更新,包括FFT、巴特沃斯濾波器(高低帶通、高低帶阻)、資料差值(線性、sinc、三次樣條*)、資料壓縮(等距、平均、峰值檢測)和模仿matlab的STFT功能(spectrogram函式

【現代訊號處理】01隨機訊號基本概念

本系列文章由Titus_1996 原創,轉載請註明出處。   文章連結:https://blog.csdn.net/Titus_1996/article/details/82799668 本系列文章使用的教材為《現代訊號處理》(第二版),張賢達著,清華大學出版社

基於TI TMS320C6678 + Xilinx Kintex-7 的高效能訊號處理方案

創龍結合TI KeyStone系列多核架構TMS320C6678及Xilinx Kintex-7系列FPGA設計的TL6678F-EasyEVM開發板是一款DSP+FPGA高速大資料採集處理平臺,其底板採用沉金無鉛工藝的8層板設計,適用於雷達聲納、視訊通訊系統、電力採集、光纜普查儀、醫用儀器、機器視覺等高速資

【 MATLAB 】訊號處理工具箱之 fft 案例分析

上篇博文:【 MATLAB 】訊號處理工具箱之fft簡介及案例分析介紹了MATLAB訊號處理工具箱中的訊號變換 fft 並分析了一個案例,就是被噪聲汙染了的訊號的頻譜分析。 這篇博文繼續分析幾個小案例: Gaussian Pulse 這個案例是將高斯脈衝從時域變換到頻域,高斯脈衝的資

【 MATLAB 】訊號處理工具箱之fft簡介及案例分析

目錄   Syntax Description Y = fft(X) Y = fft(X,n) Y = fft(X,n,dim) Examples Noisy Signal Syntax Y = fft(X) Y = fft(X

【 MATLAB 】訊號處理工具箱之 ifft 簡介及案例分析

這篇博文和上篇博文對應:【 MATLAB 】訊號處理工具箱之fft簡介及案例分析 目錄 ifft Syntax Description 案例分析 Inverse Transform of Vector Padded Inverse Transform of Matri

【 MATLAB 】訊號處理工具箱之 dct 簡介及案例分析

dct Discrete cosine transform Syntax y = dct(x) y = dct(x,n) y = dct(x,n,dim) y = dct(___,'Type',dcttype) Description y = dct(x)

Linux下的訊號詳解及捕捉訊號

訊號的基本概念 每個訊號都有一個編號和一個巨集定義名稱 ,這些巨集定義可以在 signal.h 中找到。 使用kill -l命令檢視系統中定義的訊號列表: 1-31是普通訊號 regular signal(非可靠訊號); 34-64是實時訊號 real time sign

訊號處理基礎

DC and AC 電子學中,mean通常被稱為DC(direct current),AC(alternating current)通常指訊號圍繞mean的波動。 SNR and CV SNR(signal to noise ratio),即mean與standard devia

解決Linux下網路程式設計(sendto send )出現 SIGPIPE 訊號導致程式異常終止的問題

引言 最近在Linux下網路程式設計時,出現SIGPIPE 訊號導致程式異常終止,本文記錄下解決的方法以及相應的知識。 SIGPIPE 訊號資料 什麼時候出現此訊號,APUE中有關此訊號的解釋如下: Linux man手冊有關此訊號的解釋: man 7 signal SI

用d3.js對訊號處理的結果資料作圖,得到可縮放互動的動態SVG圖

d3.js 有何用 D3.js is a JavaScript library for manipulating documents based on data. D3 helps you bring data to life using HTML, SVG, and CSS. D3’s

訊號處理的實訊號與覆信號

轉載:原部落格地址:http://blog.sina.com.cn/s/blog_5dfd405d0101iyq7.html   訊號處理中為什麼用覆信號  (2013-03-24 18:25:55) 標籤:  雜談

數字訊號處理專題(2)——利用FPGA進行基本運算及特殊函式定點運算

一、前言   FPGA以擅長高速並行資料處理而聞名,從有線/無線通訊到影象處理中各種DSP演算法,再到現今火爆的AI應用,都離不開卷積、濾波、變換等基本的數學運算。但由於FPGA的硬體結構和開發特性使得其對很多演算法不友好,之前本人零散地總結和轉載了些基本的數學運算在FPGA中的實現方式,今天做一個系統的總