Linux訊號處理函式的一些特徵

2021-08-04 03:58:53 字數 2264 閱讀 1878

linux訊號是一種非同步機制:訊號處理函式和程式的主迴圈是兩條不同的執行路線。很顯然,訊號處理函式需要盡可能快的執行完畢,以確保該訊號不會被遮蔽太久(為了避免一些競態條件,訊號在處理期間,系統不會再次觸發它),一種典型的解決方法是:

把訊號的主要處理邏輯放到程式的主迴圈中,當訊號處理函式被觸發時,它只是簡單的通知主迴圈接收到訊號,並把訊號值傳給主迴圈,主迴圈再根據接收到的訊號值執行目標函式對應的邏輯**。

訊號處理函式通常使用管道將訊號傳遞給主迴圈:訊號處理函式往管道的寫端寫入訊號值,主迴圈從管道的讀端讀出該訊號值,那麼主迴圈怎麼知道管道上何時有資料可讀呢?

這很簡單,只需要使用i/o復用系統呼叫來監聽管道的讀端檔案描述符上的可讀事件,如此一來,訊號事件就能和其他i/o事件一樣被處理,即統一事件源。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define max_event_number 1024

static

int pipefd[2];

int setnonblock(int fd)

void addfd(int epollfd, int fd)

//訊號處理函式

void sig_handler(int sig)

//設定訊號的處理函式

void addsig(int sig)

int main(int atgc, char* argv)

const

char* ip = argv[1];

int port = atoi(argv[2]);

int ret = 0;

struct sockaddr_in address;

bzero(&address, sizeof(address));

address.sin_family = af_inet;

inet_aton(ip, &address.sin_addr);

address.sin_port = htons(port);

int listenfd = socket(af_inet, sock_stream, 0);

assert(listenfd >= 0);

ret = bind(listenfd, (struct sockaddr *)&address, sizeof(address));

assert(ret != -1);

ret = listen(listenfd, 5);

assert(ret != -1);

epoll_event events[max_event_number];

int epollfd = epoll_create(5);

assert(epollfd != -1);

addfd(epollfd, listenfd);

ret = socketpair(af_unix, sock_stream, 0, pipefd);

assert(ret != -1);

//將寫端設定為非阻塞的

setnonblock(pipefd[1]);

addfd(epollfd, pipefd[0]);

addsig(sighup);

addsig(sigchld);

addsig(sigterm);

addsig(sigint);

bool stop_server = false;

while(!stop_server)

for(int i = 0; i < num; i++)

else

if((sockfd == pipefd[0]) && (events[i].events & epollin))

else

if(ret == 0)

else

case sigterm:

case sigint:}}

}}

else}}

printf("close fds\n");

close(listenfd);

close(pipefd[1]);

close(pipefd[0]);

return

0;}

訊號處理的一些知識

乙個訊號由兩個及兩個以上的sin或者cos構成 就是相當於傅利葉變換 那麼如果這其中的這些sin或cos的週期有乙個公倍數 w2 w1是乙個有理數 那麼這個訊號則是乙個週期訊號,否則就是非週期訊號。但是fft都是可以去分析的。取樣頻率fs 取樣頻率大於 2 4 倍的訊號中sin或cos的最高頻率。否...

訊號處理領域的一些名詞(一)

頻寬一般指的是訊號在頻域上的寬度,也就是訊號的最高頻率分量與最低頻率分量之差。在電子資訊領域,通常使用3db頻寬來分析系統的通頻帶,指功率比峰值的功率小3db 幅度是峰值的50 時對應的頻頻寬度。訊雜比 snr 的英文是signal noise ratio,指的是電子系統中訊號與雜訊的比值,是衡量訊...

數字訊號處理中一些概念

半連續通道 輸入和輸出空間中,乙個是離散的,乙個是連續的情況。若輸入是離散的,輸出為連續的情況就稱為輸入離散輸出連續通道。若輸入的連續的,輸出為離散的就稱為輸入連續輸出離散通道。這些是實際中常會碰到的。互資訊量 從通訊的角度看,兩個差值應該相等,即 實際上由概率論概率的乘積公式有 這樣用i x y ...