国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

有名管道_2

2024-06-28 13:24:37
字體:
來源:轉載
供稿:網友
有名管道_2編程實現雙方通信 思路

用戶A 用戶B

寫 (管道) 讀

讀 (管道) 寫

在之前有名管道的博文中,實現的雙方一發一收即為上圖所描述的。建立兩條管道,一條負責由A傳消息給B,另一條負責由B發消息給A。

當用戶A發消息給B時,B可以立即讀到消息。此時A的read為阻塞,必須等到用戶B發消息給A,A讀到消息后,A才可以繼續發消息給B。即之前博文的程序,無法實現A連續發送消息給B。

因此在這篇文章中,我們會在每個用戶中,fork出一個子進程。使用一個進程負責發消息,一個進程負責收消息。這樣就可以實現一方連續發送消息了。

注意,如果A使用子進程進行發送消息(w),那么就把子進程的讀端(r)關閉;同理,父進程負責接收消息(r),就把其寫端關閉(w)。原因?舉例來說,如果不把父進程的寫端(w)關上,那么即使關閉了子進程的寫端(w),用戶B的read還會阻塞,返回不了0,讀端(r)就無法關閉。

小結

對于管道間通信而言,每個進程要專心做自己的事情,一定要把自己用不到的端口關閉。

注意

針對管道,read的返回值有如下3種情況:

1. 讀取正常,返回讀到的字符個數

2. 對方寫端關閉,read返回0

3. 自己的讀端關閉,read出錯,返回-1。

當往一個讀端已關閉的管道里發消息時,系統會掛掉該發消息的進程。

a.c
/*************************************************************************  > File Name: send.c  > Author: KrisChou  > Mail:zhoujx0219@163.com   > Created Time: Fri 22 Aug 2014 02:46:06 PM CST ************************************************************************/#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <string.h>int main(int argc, char* argv[])//EXE send_fifo recv_fifo{    /* A創建管道1,我們假定其先發消息,再收消息 */    /* 管道2由B創建 */    PRintf("create a fifo_1.../n");    if(-1 == mkfifo(argv[1], 0666))    {        perror("mkfifo");        exit(1);    }    printf("finish make fifo_1 !/n");            /* A以寫方式打開管道1,以讀方式打開管道2 */    int fd_send, fd_recv ;    printf("open fifo..../n");    fd_send = open(argv[1], O_WRONLY);    fd_recv = open(argv[2], O_RDONLY);    if(fd_send == -1 || fd_recv == -1)    {        perror("open");        unlink(argv[1]); /* 如果打開管道失敗,刪除A自己創建的管道1 */        exit(1);    }    printf("open fifo sucess ! /n");        char send_buf[1024];    char recv_buf[1024];    /* child負責接收消息 */    if(fork() == 0)    {        close(fd_send);        while(memset(recv_buf,0,1024), read(fd_recv, recv_buf , 1024) > 0)        {            write(1,recv_buf,strlen(recv_buf));        }        close(fd_recv);        exit(1);    }    /* parent負責發送消息 */    close(fd_recv);    while(memset(send_buf,0,1024), fgets(send_buf,1024,stdin) != NULL)    {        write(fd_send, send_buf,strlen(send_buf));    }    close(fd_send);    wait(NULL);        printf("A over ! /n");    unlink(argv[1]);    //unlink(argv[2]);    return 0 ;}
b.c
/*************************************************************************  > File Name: send.c  > Author: KrisChou  > Mail:zhoujx0219@163.com   > Created Time: Fri 22 Aug 2014 02:46:06 PM CST ************************************************************************/#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <string.h>int main(int argc, char* argv[])//EXE send_fifo recv_fifo{    /* A創建管道1,我們假定其先發消息,再收消息 */    /* 管道2由B創建 */    printf("create a fifo_1.../n");    if(-1 == mkfifo(argv[2], 0666))    {        perror("mkfifo");        exit(1);    }    printf("finish make fifo_1 !/n");            /* A以寫方式打開管道1,以讀方式打開管道2 */    int fd_send, fd_recv ;    printf("open fifo..../n");    fd_recv = open(argv[1], O_RDONLY);    fd_send = open(argv[2], O_WRONLY);    if(fd_send == -1 || fd_recv == -1)    {        perror("open");        unlink(argv[2]); /* 如果打開管道失敗,刪除A自己創建的管道1 */        exit(1);    }    printf("open fifo sucess ! /n");        char send_buf[1024];    char recv_buf[1024];    /* child負責接收消息 */    if(fork() == 0)    {        close(fd_send);        while(memset(recv_buf,0,1024), read(fd_recv, recv_buf , 1024) > 0)        {            write(1,recv_buf,strlen(recv_buf));        }        close(fd_recv);        exit(1);    }        /* parent負責發送消息 */    close(fd_recv);    while(memset(send_buf,0,1024), fgets(send_buf,1024,stdin) != NULL)    {        write(fd_send, send_buf,strlen(send_buf));    }    close(fd_send);    wait(NULL);        printf("A over ! /n");    unlink(argv[1]);    //unlink(argv[2]);    return 0 ;}

上一篇:標準管道(popen)

下一篇:信號量機制

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 都兰县| 邵阳县| 蒙阴县| 鱼台县| 鞍山市| 会宁县| 玛纳斯县| 连山| 潮州市| 皋兰县| 漾濞| 铁岭县| 青浦区| 汝阳县| 花垣县| 清新县| 宿迁市| 剑河县| 湄潭县| 策勒县| 永仁县| 邹平县| 灵璧县| 都匀市| 宁夏| 阜阳市| 洱源县| 离岛区| 清流县| 无为县| 唐河县| 鱼台县| 天台县| 新宁县| 永定县| 仲巴县| 平顶山市| 平定县| 阳西县| 普兰店市| 务川|