久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C語(yǔ)言進(jìn)程間通信(一)

 yggzs2002 2017-06-20

 

進(jìn)程間通信(IPC)是指在不同進(jìn)程之間傳遞信息,。linux的進(jìn)程通信方式有管道,消息隊(duì)列,,信號(hào)量,,共享內(nèi)存,套接口等方式,下面一一整理,。

首先是管道(PIPE),,管道是Unix系統(tǒng)IPC最古老的方式,所有的Unix系統(tǒng)都提供這種通信機(jī)制,。它的優(yōu)點(diǎn)在于簡(jiǎn)單易用,,缺點(diǎn)在于有限制,詳細(xì)見(jiàn)下面幾點(diǎn):

 

  • 只能用于父子進(jìn)程或兄弟進(jìn)程之間通信
  • 大多數(shù)系統(tǒng)中都是半雙工的,,數(shù)據(jù)信息只能單向流動(dòng),,如果需要雙向通信則需要建立兩個(gè)管道
  • 傳輸?shù)氖菬o(wú)格式字節(jié)流,需要雙方約定格式
  • 管道緩沖區(qū)是有限的,,等等
首先來(lái)看父子進(jìn)程之間通信的例子,。
C代碼  收藏代碼
  1. #include<stdio.h>  
  2. #include<limits.h>  
  3. #include<sys/types.h>  
  4. #include<string.h>  
  5. #include<stdlib.h>  
  6.   
  7. #define BUFSIZE PIPE_BUF  //管道默認(rèn)一次性讀取的數(shù)據(jù)長(zhǎng)度  
  8.   
  9. void err_quit(char *err) {  
  10.         printf("%s\n",err);  
  11.         exit(-1);  
  12. }  
  13.   
  14. int main()  
  15. {  
  16.         int fd[2];  
  17.         char buf[BUFSIZE] = "hello my son";  
  18.         pid_t pid;  
  19.   
  20.         if (pipe(fd) < 0) {  
  21.                 err_quit("pipe error");  
  22.         }  
  23.         if ((pid = fork()) < 0) {  
  24.                 err_quit("fork error");  
  25.         }  
  26.         else if(pid > 0) { //父進(jìn)程  
  27.                 close(fd[0]);  
  28.                 write(fd[1], buf, strlen(buf));  
  29.         }  
  30.         else {  
  31.                 close(fd[1]);  
  32.                 int len = read(fd[0], buf, BUFSIZE);  
  33.                 if (len < 0) {  
  34.                         err_quit("read error");  
  35.                 }  
  36.                 printf("Get : %s\n",buf);  
  37.         }  
  38.         return 0;  
  39. }  
 接下來(lái)是兄弟進(jìn)程之間通信的例子。
C代碼  收藏代碼
  1. #include<stdio.h>  
  2. #include<limits.h>  
  3. #include<sys/types.h>  
  4. #include<string.h>  
  5. #include<stdlib.h>  
  6.   
  7. #define BUFSIZE PIPE_BUF  //管道默認(rèn)一次性讀取的數(shù)據(jù)長(zhǎng)度  
  8.   
  9. void err_quit(char *err) {  
  10.     printf("%s\n",err);  
  11.     exit(-1);  
  12. }  
  13.   
  14. int main()  
  15. {  
  16.     int fd[2];  
  17.     char buf[BUFSIZE] = "hello my brother";  
  18.     pid_t pid;  
  19.   
  20.     if (pipe(fd) < 0) {  
  21.         err_quit("pipe error");  
  22.     }  
  23.     if ((pid = fork()) < 0) {  
  24.         err_quit("fork error");  
  25.     }  
  26.     else if(pid > 0) { //父進(jìn)程  
  27.   
  28.         if ((pid = fork()) < 0) {  
  29.             err_quit("fork error");  
  30.         }  
  31.         else if (pid > 0) { //父進(jìn)程  
  32.   
  33.         }  
  34.         else {  
  35.             close(fd[0]);  
  36.             write(fd[1], buf, strlen(buf));  
  37.         }  
  38.     }  
  39.     else {  
  40.         close(fd[1]);  
  41.         int len = read(fd[0], buf, BUFSIZE);  
  42.         if (len < 0) {  
  43.             err_quit("read error");  
  44.         }  
  45.         printf("Get : %s\n",buf);  
  46.     }  
  47.     return 0;  
  48. }  
 代碼都很簡(jiǎn)單,,只是需要記住在創(chuàng)建新進(jìn)程后記得分別關(guān)閉讀寫(xiě)描述符,。如果想讓子進(jìn)程給父進(jìn)程傳遞數(shù)據(jù),則關(guān)閉父進(jìn)程的寫(xiě)描述符和子進(jìn)程的讀描述符即可,。利用管道可以做簡(jiǎn)單的進(jìn)程同步工作,,因?yàn)樽x端會(huì)一直阻塞到寫(xiě)端發(fā)出數(shù)據(jù)后再運(yùn)行后面的代碼,可以利用這個(gè)特點(diǎn)保證讓指定的進(jìn)程先運(yùn)行,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多