亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

進程間通信之協同進程

2024-06-28 13:27:55
字體:
來源:轉載
供稿:網友
進程間通信之協同進程

UNIX系統過濾程序從標準輸入讀取數據,對其進行適當處理后寫到標準輸出。幾個過濾程序通常在shell管道命令行中線性地連接。當一個程序產生某個過濾程序的輸入,同時又讀取該過濾程序的輸出時,則過濾程序就成為協同進程(coPRocess)。

Korn shell提供了協同進程。Bourne shell、Bourne-again shell和C shell并沒有提供按協同進程方式將進程連接起來的方法。協同進程通常在shell的后臺運行,其標準輸入和標準輸出通過管道連接到另一個程序。

popen只提供連接到另一個進程的標準輸入或標準輸出的一個單向管道,而對于協同進程,則它有連接到另一個進程的兩個單向管道——一個接到其標準輸入,另一個則來自其標準輸出。我們先要將數據寫到其標準輸入,經其處理后,再從其標準輸出讀取數據。

實例

進程線創建兩個管道:一個是協同進程的標準輸入,另一個是協同進程的標準輸出。圖15-8顯示了這種安排。

未命名

                 圖15-8 寫協同進程的標準輸入,讀它的標準輸出

程序清單15-8程序是一個簡單的協同進程,它從其標準輸入讀兩個數,計算它們的和,然后將結果寫至標準輸出。

程序清單15-8 對兩個數求和的簡單過濾程序

#include "apue.h"intmain(void){    int     n, int1, int2;    char    line[MAXLINE];    while((n = read(STDIN_FILENO, line, MAXLINE)) > 0)    {        line[n] = 0;    /* null terminate */        if(sscanf(line, "%d%d", &int1, &int2) == 2)        {            sprintf(line, "%d/n", int1 + int2);            n = strlen(line);            if(write(STDOUT_FILENO, line, n) != n)                err_sys("write error");        }        else        {            if(write(STDOUT_FILENO, "invalid args/n", 13) != 13)                err_sys("write error");        }    }    exit(0);}

對此程序進行編譯,將其可執行目標代碼存入名為add2的文件。

程序清單15-9從其標準輸入讀入兩個數之后調用add2協同進程,并將協同進程送來的值寫到其標準輸出。

程序清單15-9 驅動add2過濾程序的程序

#include "apue.h"static void sig_pipe(int);    /* our signal handler */intmain(void){    int      n, fd1[2], fd2[2];    pid_t    pid;    char     line[MAXLINE];    if(signal(SIGPIPE, sig_pipe) == SIG_ERR)        err_sys("signal error");    if(pipe(fd1) < 0  || pipe(fd2) < 0)        err_sys("pipe error");    if((pid = fork()) < 0)    {        err_sys("fork error");    }    else if(pid > 0)    /* parent */    {        close(fd1[0]);        close(fd2[1]);        while(fgets(line, MAXLINE, stdin) != NULL)        {            n = strlen(line);            if((m = write(fd1[1], line, n)) != n);   /* 無論這里的if條件是真是假都執行err_sys(“write error to pipe”);不知為何 */            {                err_sys("write error to pipe");            }            if((n = read(fd2[0], line, MAXLINE)) < 0)                err_sys("read error from pipe");            if(n == 0)            {                err_msg("child closed pipe");                break;            }            line[n] = 0;    /* null terminate */            if(fputs(line, stdout) == EOF)                err_sys("fputs error");        }                if(ferror(stdin))            err_sys("fgets error on stdin");        exit(0);    }    else    /* child */    {        close(fd1[1]);        close(fd2[0]);        if(fd1[0] != STDIN_FILENO)        {            if(dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO)                err_sys("dup2 error to stdin");            close(fd1[0]);        }        if(fd2[1] != STDOUT_FILENO)        {            if(dup2(fd2[1], STDOUT_FILENO) != STDOUT_FILENO)                err_sys("dup2 error to stdout");            close(fd2[1]);        }        if(execl("./add2", "add2", (char *)0) < 0)            err_sys("execl error");    }    exit(0);}static voidsig_pipe(int signo){    printf("SIGPIPE caught/n");    exit(1);}

在程序中創建了兩個管道,父、子進程各自關閉它們不需要使用的端口。兩個管道一個用作協同進程的標準輸入,另一個則用作它的標準輸出。子進程調用dup2使管道描述符移至其標準輸入和標準輸出,然后調用execl。

實例

在協同進程add2中,有意地使用了read和writeI/O(UNIX系統調用)。如果使用標準I/O改寫該協同進程,其后果是什么呢?程序清單15-10為改寫后的版本。

程序清單15-10 對兩個數求和的過濾程序,使用標準I/O

#include "apue.h"intmain(void){    int      int1, int2;    char     line[MAXLINE];    while(fgets(line, MAXLINE, stdin) != NULL)    {            if(sscanf(line, "%d%d", &int1, &int2) == 2)        {            if(printf("%d/n", int1 + int2) == EOF)                err_sys("printf error");        }        else        {            if(printf("invalid args/n") == EOF)                err_sys("printf error");        }    }    exit(0);}

若程序清單15-9調用此新的協同進程,則它不再工作。問題出在系統默認的標準I/O緩沖機制上(見http://www.CUOXin.com/nufangrensheng/p/3505307.html)。當調用程序清單15-10所示程序時,對標準輸入的第一個fgets引起標準I/O庫分配一個緩沖區,并選擇緩沖區的類型。因為標準輸入是個管道,所以標準I/O庫由系統默認是全緩沖的。對標準輸出也做同樣的處理。當add2從其標準輸入讀取而發生阻塞時,程序清單15-9程序從管道讀時也發生阻塞,于是產生了死鎖。

為此,更改將要運行的協同進程的緩沖類型,在程序清單15-10中的while循環之前加上下面4行:

if(setvbuf(stdin, NULL, _IOLBF, 0) != 0)    err_sys("setvbuf error");if(setvbuf(stdout, NULL, _IOLBF, 0) != 0)    err_sys("setvbuf error");

這些代碼行使得當有一行可用時,fgets就返回,并使得當輸出一換行符時,printf立即執行fflush操作。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产综合香蕉五月婷在线| 夜夜躁日日躁狠狠久久88av| 国产精品网址在线| 国产欧美在线观看| 久久亚洲欧美日韩精品专区| 久久天堂av综合合色| 5278欧美一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 91高清视频免费观看| 久久视频这里只有精品| 欧美中文字幕在线视频| 亚洲国产精品热久久| 亚洲日韩中文字幕在线播放| 欧美一级免费视频| 欧美成人中文字幕| 欧美日韩在线看| 欧美视频精品一区| 亚洲在线第一页| 97国产精品视频人人做人人爱| 日韩av免费一区| 欧美高跟鞋交xxxxhd| 2019日本中文字幕| 奇门遁甲1982国语版免费观看高清| 最新69国产成人精品视频免费| 国产日韩欧美日韩大片| 成人精品久久久| 国产欧美精品一区二区三区-老狼| 精品久久久久久亚洲国产300| 中文字幕在线看视频国产欧美在线看完整| 中文字幕久热精品视频在线| 狠狠躁夜夜躁人人爽天天天天97| 国产精品久久久久av免费| 亚州国产精品久久久| 亚洲美女精品成人在线视频| 久久久国产精彩视频美女艺术照福利| 亚洲欧美中文日韩在线| 欧美视频在线观看免费| 国产日韩视频在线观看| 欧美午夜片欧美片在线观看| 国产精品最新在线观看| 久久综合免费视频影院| 久久影视免费观看| 欧美精品一二区| 亚洲男人天堂2023| 久久综合88中文色鬼| 久久久免费在线观看| 国产精品av在线播放| 国产精品一区久久| 欧美精品久久久久| 精品香蕉一区二区三区| 国产精品久久久久影院日本| 国产精品亚洲第一区| 亚洲老头同性xxxxx| 38少妇精品导航| 欧美亚洲视频一区二区| 国产aⅴ夜夜欢一区二区三区| 亚洲成人网久久久| 久久中国妇女中文字幕| 午夜精品久久久久久99热软件| 欧美性xxxx极品hd欧美风情| 亚洲精品日韩av| 国产日韩欧美中文| 国产精品久久久久免费a∨大胸| 亚洲天堂网站在线观看视频| 91久久久久久久久久| 97色在线播放视频| 亚洲美女在线看| 国产精品99免视看9| 91产国在线观看动作片喷水| 精品国产一区二区三区久久久| 国产精品丝袜久久久久久不卡| 国产精品欧美久久久| 久久人人爽人人| 欧美性猛交xxxx乱大交极品| 欧美高清在线播放| 色香阁99久久精品久久久| 2019亚洲男人天堂| 亚洲第一区在线| 成人午夜在线视频一区| 91黑丝高跟在线| 欧美在线观看网址综合| 亚洲jizzjizz日本少妇| 日本一区二区三区在线播放| 精品一区二区亚洲| 日韩美女中文字幕| 色伦专区97中文字幕| 91免费看视频.| 91在线观看免费网站| 正在播放欧美一区| 狠狠躁18三区二区一区| 欧美日韩国产麻豆| 91久久久久久久久久久| 亚洲欧美国内爽妇网| 日本国产欧美一区二区三区| 亚洲国产天堂久久国产91| 一区二区三区四区精品| 国产成人精品国内自产拍免费看| 成人精品视频99在线观看免费| 日韩va亚洲va欧洲va国产| 国产精品日韩在线播放| 亚洲美女性生活视频| 欧美另类极品videosbestfree| 国产欧美一区二区三区久久人妖| 青青草成人在线| 亚洲一区二区三区777| 日本欧美一二三区| 亚洲精品日韩在线| 久久激情视频久久| 成人a视频在线观看| 久久精品中文字幕| 中文字幕亚洲欧美一区二区三区| 中文字幕亚洲图片| 国产精品免费在线免费| 成人黄色大片在线免费观看| 91黑丝在线观看| 日韩av在线免费看| 国产精品狼人色视频一区| 久久久精品免费视频| 日韩精品在线免费观看视频| 2019中文字幕在线免费观看| 91香蕉国产在线观看| 亚洲精品福利免费在线观看| 69久久夜色精品国产69乱青草| 国产一区玩具在线观看| 亚洲综合视频1区| 久色乳综合思思在线视频| 国产一区二区在线免费视频| 97色在线观看| 日韩中文有码在线视频| 国产精品一香蕉国产线看观看| 日韩欧美在线网址| 热久久美女精品天天吊色| 97在线视频免费看| 亚洲视频一区二区| 亚洲精品视频久久| 日韩成人在线免费观看| 97香蕉超级碰碰久久免费软件| 亚洲一区av在线播放| 97久久精品人搡人人玩| 青草青草久热精品视频在线网站| 亚洲第一免费网站| 国产精品久久久久久久久久ktv| 欧美精品在线免费播放| 中文字幕在线观看亚洲| 日韩在线观看你懂的| 中文字幕欧美日韩在线| 亚洲精品久久久久中文字幕二区| 亚洲欧美日韩综合| 欧美高清第一页| 欧洲午夜精品久久久| 亚洲欧美日韩在线高清直播| 久久久av网站| 亚洲国产小视频在线观看| 国产69精品久久久久99| 国产精品视频网站| 亚洲国产精品久久久久秋霞不卡| 久久精品免费播放| 欧美成aaa人片免费看| 日韩精品免费电影| 26uuu亚洲伊人春色| 日本久久中文字幕| 45www国产精品网站| 欧美性猛交xxxx偷拍洗澡| 最近中文字幕2019免费|