管道的作用:進程間的通信
無名管道:
只能在父子進程中進行通信
? ? ? ????pipe
????????int?pipe(int?pipefd[2]);
????????功能:
????????????創建一個無名管道
????????參數:
????????????pipefd[0]:讀管道文件描述符
????????????pipefd[1]:寫管道文件描述符
????????返回值:
????????????成功返回0?
????????????失敗返回-1?
????????無名管道特性:
????????????1.管道中至少有一個寫端:?
????????????????讀取數據時,如果管道中有數據直接讀取,管道中沒有數據阻塞等待直到有數據寫入讀出,繼續向后執行
????????????2.管道中沒有寫端:
????????????????讀取數據時,如果管道中有數據直接讀取,管道中沒有數據不阻塞等待直接向下執行
????????????3.管道中至少有一個讀端:
????????????????寫入數據時,如果管道中沒有存滿,則直接寫入,管道中如果存滿,則阻塞等待直到有數據讀出,才能繼續寫入
????????????4.管道中沒有讀端:
????????????????寫入數據時,會產生管道破裂錯誤,導致程序崩潰
有名管道:
????????打開管道文件?->?讀寫管道文件?->?關閉管道文件
????????注意:有名管道必須讀寫兩端同時加入才能繼續向下執行
????????1.mkfifo?
??????????int?mkfifo(const?char?*pathname,?mode_t?mode);
??????????功能:
????????????創建一個管道文件
??????????參數:
????????????pathname:管道文件路徑
????????????mode:權限
??????????返回值:
????????????成功返回0?
????????????失敗返回-1?
有名管道的雙工通信代碼編寫:
思路:兩個文件,每個文件設兩個進程,a進程用于發送信息,b進程用于接受信息
????????memset函數
????????void *memset(void *s, int c, size_t n);
????????功能:將S中的值全賦成c-----將s初始化。
2.信號
實現內核層與用戶層的信息交互,或者進程間的通信
2.1信號的種類:
kill-l?查詢信號
kill -信號序號 +進程pid? ? ? ? 對進程進行操作
2.2信號處理方式:
2.2.1缺省:默認方式
2.2.2忽略:不相應信號
2.2.3捕捉:按自定義方式處理
? ? ? ? 9號SIGKILL,19號SIGSTOP不能被忽略和捕捉
? ? ? ? SIGINT:Ctrl+c
? ? ? ? SIGQUIT:ctrl+\
? ? ? ? SIGTSTP:ctrl+z
2.2.4signal
? ? ? ? void fun(int a);
? ? ? ? signal(SIGN,fun);????????
????????功能:
????????????改變信號的處理方式
? ? ? ? 參數:SIGN:信號名稱
? ? ? ? ? ? ? ? ? ? fun:遇到信號后的處理方式的函數
????????返回值:
????????????成功返回之前處理函數的首地址
????????????失敗返回SIG_ERR?