天天看點

詳解linux程序間通信-信号

  前言:之前說看《C++ Primer 》暫時擱淺一下,迷上公司大神寫的代碼,想要明白,主要是socket、程序間通信!

  知道程序間通信:信号、信号量、管道、消息隊列、共享記憶體(共享存儲),也能寫些簡單代碼進行通信,但不知道應用在哪?感覺很多小夥伴跟我有類似經曆吧?

  一、應用執行個體:

  要去linux裝置上去添加、改密使用者:本地去linux裝置添加使用者,用socket實作,其實大神改的ssh源碼來實作的,這不是我要講的重點,而我要講的是準備過程,去登陸linux裝置,要準備好:管理者、密碼等。

  簡略說明中間過程:頁面點選添加,調用cli(socket的用戶端,socket本地通信),server.c(socket服務端)裡fork子程序,而實作登入linux裝置的是ssh程序,但是ssh程序需要管理者、密碼等資訊,那子程序怎麼傳給它,就需要程序間通信方式了,大神用的是消息隊列。

  講到這裡不知道明白了麼?有問題可以随時留言。

  接下來将詳解程序間通信方式。

  二、程序間通信-信号:

  1、信号概念:

  信号的概念

  首先,每個信号都有一個名字。這些名字都以三個字元 S I G開頭。 S I G A L R M是鬧鐘信号,當由a l a r m函數設定的時

間已經超過後産生此信号。 

   産生信号條件:

  • 當使用者按某些終端鍵時,産生信号。

  • 硬體異常産生信号:除數為0、無效的存儲通路等等。

  • 程序用k i l l 函數可将信号發送給另一個程序或程序組。

  • 使用者可用k i l l 指令将信号發送給其他程序。此程式是 k i l l函數的界面。

  • 當檢測到某種軟體條件已經發生,并将其通知有關程序時也産生信号。

  可以要求系統在某個信号出現時按照下列三種方式中的一種進行操作:

  (1) 忽略此信号。 

  (2) 捕捉信号。 

  (3) 執行系統預設動作。

  2、signal函數

  signal(int signum, sighandler_t handler); 

  格式 :signal(信号,信号處理函數)

  功能 :登記信号 當信号到來時 執行信号處理函數 而不采用預設的處理方式

  注:sighandler_t是函數指針,typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);

  程式:檢測信号,調用處理函數 

#include "my.h"

void sig_fun(int sig)
{
puts("ding-ling!");
}

int main()
{
signal(SIGALRM,sig_fun);
alarm(5);
for(;;) {} 
return 0;

}      

---程式2.2---

注:

  5秒之後産生産生SIGALRM信号,調用sig_fun函數。

  alarm函數:

  使用a l a r m函數可以設定一個時間值 (鬧鐘時間),在将來的某個時刻該時間值會被超過。當

所設定的時間值被超過後,産生 S I G A L R M信号。

  #include <unistd.h>

  unsigned int alarm(unsigned int s e c o n ds) ;  

  注:“my.h”是我自定義頭檔案,因為頭檔案友善書寫,為了便于調試和了解,把頭檔案粘出來,如下: 

#ifndef MY_H_
#define MY_H_

#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <pthread.h>
#include <semaphore.h>
#endif      

  3、其他常用函數

  (1)kill和r a i s e函數

  k i l l函數将信号發送給程序或程序組。 r a i s e函數則允許程序向自身發送信号。    

  #include <sys/types.h>  

  #include <signal.h>

  int kill(pid_t p id, int s i g no) ;

  int raise(int s i g n o) ;

  兩個函數傳回:若成功則為 0,若出錯則為-1

  (2)pause函數

  p a u s e函數使調用程序挂起直至捕捉到一個信号。

  int pause(void);

  程式:優化“程式2.2”,用pause函數代替死循環,檢測信号之後并退出,如下:

#include "my.h"

void sig_fun(int sig)
{
puts("ding-ling!");
}

int main()
{
signal(SIGALRM,sig_fun);
alarm(5);
printf("111\n");
pause();
//for(;;) {} 
printf("222\n");
return 0;

}

---程式2.3---      

總結:以上介紹程序間通信應用執行個體,然後介紹了程序間通信的信号,接下來會介紹其餘程序間通信方式。

  

作者:

柳德維

出處:

https://www.cnblogs.com/liudw-0215/

-------------------------------------------

個性簽名:獨學而無友,則孤陋而寡聞。做一個靈魂有趣的人!

如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,部落客在此感謝!

萬水千山總是情,打賞一分行不行,是以如果你心情還比較高興,也是可以掃碼打賞部落客,哈哈哈(っ•̀ω•́)っ⁾⁾!

繼續閱讀