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 ...