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

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

進程間通信和同步:pipe、FIFO、消息隊列、信號量、共享內存、信號

2024-06-28 13:27:38
字體:
來源:轉載
供稿:網友
進程間通信和同步:pipe、FIFO、消息隊列、信號量、共享內存、信號一、半雙工管道(pipe)

image

關于管道詳細介紹可參考http://www.CUOXin.com/nufangrensheng/p/3560130.html。

1、管道實現父子進程間通信實例:

/* pipe.c */#include <unistd.h>#include <stdio.h>#include <limits.h>#include <sys/types.h>#include <errno.h>#include <stdlib.h>#define MAXLINE 1024int main(void){    int fd[2], pid;    char buf[MAXLINE];        if(pipe(fd) < 0)    {        perror("pipe error");        exit(1);    }        if((pid = fork()) < 0)    {        perror("fork error");        exit(1);    }    else if(pid == 0)    /* child */    {        close(fd[1]);    /* read from parent */                if(read(fd[0], buf, MAXLINE) < 0)        {            perror("read error");            exit(1);        }        PRintf("read from parent: %s/n", buf);    }    else            /* parent */    {        close(fd[0]);    /* send to child */                if(write(fd[1], "hello, i am your parent", 24) != 24)        {            perror("write error");            exit(1);        }        printf("send to  child OK!/n");        wait(NULL);    }}

編譯運行結果:

image

2、管道實現父子進程間同步實例:

/* pipe_sync.c */#include <sys/types.h>#include <errno.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#define    BUFSIZE    1024int fd1[2], fd2[2];char c;void tell_wait(){    if(pipe(fd1) < 0 || pipe(fd2) < 0)    {        perror("pipe error");        exit(1);        }}void tell_parent(){    if(write(fd1[1], "c", 1) != 1)    {        perror("write error");        exit(1);    }}void wait_parent(){    if(read(fd2[0], &c, 1) != 1)    {        perror("read error");        exit(1);    }    if(c != 'p')    {        printf("wait_parent: invalid data/n");        exit(1);    }}void tell_child(){    if(write(fd2[1], "p", 1) != 1)    {        perror("write error");        exit(1);    }}void wait_child(){    if(read(fd1[0], &c, 1) != 1)    {        perror("read error");        exit(1);    }    if(c != 'c')    {        printf("wait_child: invalid data");        exit(1);    }}intmain(void){    int pid;    tell_wait();    if((pid = fork()) < 0)    {        perror("fork error");        exit(1);    }    else if(pid == 0)    {        printf("child: first/n");        tell_parent();    }    else    {        wait_child();        printf("parent: after child/n");    }    return(0);}

編譯運行結果:

image

 

二、命名管道(FIFO)

image

在文件系統中命名管道是以設備特殊文件的形式存在的。

不同的進程可以通過命名管道共享數據。

關于FIFO詳細介紹可參考http://www.CUOXin.com/nufangrensheng/p/3561632.html。

FIFO實現進程間通信實例:

/**************************** **** FIFO server*************************************/#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <unistd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#define FIFO     "/home/zhu/network/fifo/myfifo"#define OPEN_MODE    O_RDONLYintmain(void){    int fifofd;    char buf[80];
    unlink(FIFO);  /* 防止FIFO已存在 */   
 if(mkfifo(FIFO, 0777) == -1)    {        perror("mkfifo");        exit(1);    }    if((fifofd = open(FIFO, OPEN_MODE)) < 0)    {        perror("open");        exit(1);    }        read(fifofd, buf, sizeof(buf));    printf("message from client: %s/n", buf);    close(fifofd);    return(0);}
/**************************** **** FIFO client*************************************/#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <unistd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/stat.h>#define FIFO     "/home/zhu/network/fifo/myfifo"#define OPEN_MODE    O_WRONLYintmain(void){    int fifofd;    char s[] = "hello,server!";    if((fifofd = open(FIFO, OPEN_MODE)) < 0)    {        perror("open");        exit(1);    }        write(fifofd, s, sizeof(s));    printf("write message: %s/n", s);    close(fifofd);    return(0);}

編譯成功后,我們首先運行服務器(創建FIFO,等待客戶發來消息,此時FIFO服務器阻塞):

image

接著我們在另一個終端窗口運行客戶程序,如下圖所示,可以看出客戶端已成功發送,服務器端也成功接收:

image

 

三、消息隊列

消息隊列是內核地址空間中的內部鏈表,通過linux內核在各個進程之間傳遞內容。

關于消息隊列詳細介紹可參考http://www.CUOXin.com/nufangrensheng/p/3561820.html。

消息隊列實現進程間通信實例:

/**********************************MSGQ server*************************************/#include <sys/msg.h>#include <sys/ipc.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <fcntl.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#define msqpath    "/home/zhu/network/msgqueue/msq"#define proj_id    'b'struct mymesg {    long mtype;    char mtext[512];    };int main(void){    key_t key;    int msqid;    struct msqid_ds buf;        struct mymesg msg1;    msg1.mtype = 1;    sprintf(msg1.mtext, "hello");    if((key = ftok(msqpath, proj_id)) < 0)    {        perror("ftok");        exit(1);    }    if((msqid = msgget(key, IPC_CREAT)) < 0)    {        perror("msgget");        exit(1);    }             if(msgsnd(msqid, &msg1, sizeof(msg1), IPC_NOWAIT) < 0)    {        perror("msgsnd");        exit(1);    }    printf(“send message : hello/n”);    if(msgctl(msqid, IPC_STAT, &buf) < 0)    {        perror("msgctl");        exit(1);    }    printf("message queue # of messages is: %d/n", buf.msg_qnum);    return(0);    }
/***************************************MSGQ client**************************************/#include <sys/msg.h>#include <sys/ipc.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <fcntl.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#define msqpath    "/home/zhu/network/msgqueue/msq"#define proj_id    'b'struct mymesg {    long mtype;    char mtext[512];    };int main(void){    key_t key;    int msqid;    struct msqid_ds buf;       struct mymesg msg1;    if((key = ftok(msqpath, proj_id)) < 0)    {        perror("ftok");        exit(1);    }    if((msqid = msgget(key, IPC_EXCL)) < 0)    {        perror("msgget");        exit(1);    }             if(msgrcv(msqid, &msg1, sizeof(msg1), 0, IPC_NOWAIT) < 0)    {        perror("msgrcv");        exit(1);    }    printf("receive message : %s/n", msg1.mtext);        if(msgctl(msqid, IPC_STAT, &buf) < 0)    {        perror("msgctl");        exit(1);    }    printf("message queue # of messages is: %d/n", buf.msg_qnum);    return(0);    }

編譯后運行結果如下:

image

 

四、信號量

信號量是一種計數器,用來控制對多個進程共享的資源所進行的訪問。它們常常被用作一個鎖機制,在某個進程正在對特定資源進行訪問時,信號量可以防止另一個進程去訪問它。

關于信號量詳細介紹可參考http://www.CUOXin.com/nufangrensheng/p/3562046.html。

信號量實現資源控制實例:

#include <sys/types.h>#include <linux/sem.h>#include <linux/ipc.h>#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <unistd.h>#define sempath    "/home/zhu/network/semaphore/sem"#define proj_id    'c'intmain(void){    int semid, i;    key_t    key;    union semun sem, getsem;    sem.val = 3;    if((key = ftok(sempath, proj_id)) < 0)    {        perror("ftok");        exit(1);    }        if((semid = semget(key, 1, IPC_CREAT)) < 0)    {        perror("semget");        exit(1);    }        semctl(semid, 0, SETVAL, sem);        semctl(semid, 0, GETVAL, sem);        printf("# of usable semphore: %d/n", sem.val);    struct sembuf sops = {0, -1, IPC_NOWAIT};    for(i = 0; i < 4; i++)    {        printf(“%dth:”,i+1);
     fflush(stdout);        if(semop(semid, &sops, 1) < 0)        {            perror("semop");            exit(1);        }
     printf("ask for one semaphore:success!/n");    }        return(0);}

編譯運行結果如下(因為我們把信號量值設置為3,所以第四次資源請求失?。?/p>

image

注意,在上面的程序中,包含的頭文件#include <linux/sem.h> 和#include <linux/ipc.h>。而不是#include <sys/sem.h> #include <sys/ipc.h>。否則出現“storage of size of 'sem' isn't know”的錯誤。詳細介紹請參考http://hi.baidu.com/yuhongyangcn/item/f52545b33c1b55a1eaba93ac。

關于POSIX信號量詳情可參考http://www.CUOXin.com/nufangrensheng/p/3564306.html。

注意使用POSIX信號量時,除了要包含頭文件<semaphore.h>外,在編譯選項中還有加上-lrt選項,否則出現“undefined reference to”這樣的編譯錯誤。

五、共享內存

共享內存是在多個進程之間共享內存區域的一種進程間通信的方式,它是在多個進程間對內存段進行映射的方式實現內存共享的。這是最快的IPC方式。

關于共享內存詳細介紹可參考http://www.CUOXin.com/nufangrensheng/p/3563712.html。

共享內存實現父子進程間通信(這里為了簡化、突出共享內存的使用方式,并沒有加入同步處理,而只是簡單地使用sleep模擬同步):

#include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <string.h>static char msg[] = "hello, share memory!";int main(void){    key_t key;    char i, *shms, *shmc;    pid_t pid;    int shmid;        key = ftok("/home/zhu/network/shmm/shm", 'a');    shmid = shmget(key, 1024, IPC_CREAT | 0604);    pid = fork();    if( pid > 0)    {        shms = (char *)shmat(shmid, 0, 0);        memcpy(shms, msg, strlen(msg) + 1);        sleep(5);        shmdt(shms);    }    else if(pid == 0)    {        shmc = (char *)shmat(shmid, 0, 0);        sleep(2);        printf("the content in the share memory is : %s/n", shmc);        shmdt(shmc);    }    return(0);}
運行結果:

image

六、信號

信號(signal)機制是UNIX系統中最為古老的進程之間的通信機制。它用于在一個或多個進程之間傳遞異步信號。

關于信號詳細介紹可參考http://www.CUOXin.com/nufangrensheng/p/3514157.html。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久青草精品视频免费观看| 日韩电影大片中文字幕| 俺去啦;欧美日韩| 久久久久久噜噜噜久久久精品| 51久久精品夜色国产麻豆| 91精品国产色综合久久不卡98| 欧美性色xo影院| 国产欧美一区二区白浆黑人| 国产99久久精品一区二区 夜夜躁日日躁| 国产91色在线免费| 日韩欧美亚洲成人| 欧美日产国产成人免费图片| 91高潮在线观看| 欧美电影《睫毛膏》| 欧美精品国产精品日韩精品| 国产成人久久久精品一区| 国产精品视频精品视频| 亚洲欧美另类中文字幕| 精品一区二区三区三区| 成人春色激情网| 国产精品wwww| 久久91精品国产91久久跳| 欲色天天网综合久久| 欧美一级大片在线免费观看| 精品动漫一区二区| 国产一区深夜福利| 97碰在线观看| 国产亚洲日本欧美韩国| 91黑丝在线观看| 最近中文字幕2019免费| 欧美成人四级hd版| 不卡av电影院| 欧美精品中文字幕一区| 国产欧美韩国高清| 亚洲日本中文字幕免费在线不卡| 在线视频欧美日韩精品| 欧美一级大胆视频| 久久久久久久久久久成人| 国产不卡一区二区在线播放| 国产日韩亚洲欧美| 欧美亚洲成人精品| 亚洲国产又黄又爽女人高潮的| 亚洲电影在线观看| 久久久噜噜噜久久中文字免| 成人久久一区二区| 国产精品自拍偷拍视频| 久久久国产精品视频| 国产精品久久久久久久7电影| 91国语精品自产拍在线观看性色| 国产97在线亚洲| 亚洲第一视频在线观看| 日韩欧美在线视频免费观看| 亚洲男人天堂九九视频| 欧洲永久精品大片ww免费漫画| 清纯唯美日韩制服另类| 国产精品网址在线| 一区二区在线视频播放| 日本一本a高清免费不卡| 在线视频一区二区| 欧美人与性动交| 亚洲综合av影视| 国产亚洲人成a一在线v站| 姬川优奈aav一区二区| 亚洲美女在线观看| 日韩在线视频观看正片免费网站| 欧美午夜精品久久久久久浪潮| 久久激情视频久久| 日韩不卡中文字幕| 亚洲国产成人久久综合| 日韩av男人的天堂| 少妇高潮久久77777| 日本欧美爱爱爱| 国产精品99蜜臀久久不卡二区| 亚洲伦理中文字幕| 精品国产一区二区三区久久| 国产综合色香蕉精品| 久久手机精品视频| 91精品国产综合久久男男| 国产精品第七十二页| 国产精品入口免费视| 午夜精品一区二区三区视频免费看| 欧美一级成年大片在线观看| 日产精品99久久久久久| 日韩国产一区三区| 久久免费精品日本久久中文字幕| 欧美色videos| 亚洲va码欧洲m码| 日韩有码在线视频| 亚洲精品日韩丝袜精品| 久久99久久99精品免观看粉嫩| 日韩av在线免费播放| 日韩精品极品毛片系列视频| 欧美洲成人男女午夜视频| 亚洲成人黄色在线观看| 91麻豆桃色免费看| 91日本在线视频| 亚洲跨种族黑人xxx| 国产精品久久综合av爱欲tv| 亚洲欧美另类在线观看| 精品美女国产在线| 日韩在线播放av| 一本色道久久综合狠狠躁篇怎么玩| 国产欧美一区二区三区在线看| 日韩av在线免播放器| 久久资源免费视频| 91产国在线观看动作片喷水| 日韩av综合网站| 欧美极品美女视频网站在线观看免费| 欧美人成在线视频| 成人羞羞国产免费| 欧美大片第1页| 日本a级片电影一区二区| 欧美激情国内偷拍| 亚洲精品中文字幕av| 久久成人人人人精品欧| 日本精品中文字幕| 亚洲v日韩v综合v精品v| 97婷婷大伊香蕉精品视频| 亚洲一区二区三区视频播放| 国自在线精品视频| 亚洲福利视频免费观看| 久久天天躁狠狠躁夜夜躁2014| 精品av在线播放| 国产一区二区三区视频免费| 国产欧美日韩免费看aⅴ视频| 免费97视频在线精品国自产拍| 国内精品一区二区三区四区| 久久久久久久久久久免费精品| 久久久成人av| 久久国产精品久久精品| 久久久999国产| 国产精品成人一区二区| 国产免费一区二区三区在线能观看| 色悠悠久久88| 国产精品一区专区欧美日韩| 亚洲国产小视频在线观看| 亚洲精品免费在线视频| 亚洲图片制服诱惑| 亚洲老头老太hd| 琪琪第一精品导航| 国模极品一区二区三区| 亚洲男人天堂视频| 亚洲欧美一区二区三区情侣bbw| 日韩av在线最新| 国产一区二区三区在线观看视频| 亚洲精品av在线| 91在线观看免费| 91av视频在线| 亚洲一区二区三区四区视频| 日韩在线免费高清视频| 国产有码一区二区| 久久久999国产精品| 欧美在线性爱视频| 亚洲欧洲黄色网| 136fldh精品导航福利| 国产精品免费久久久久影院| 久久久久久国产| 国产精品视频一区二区高潮| 亚洲国产精品va在线看黑人| 琪琪亚洲精品午夜在线| 欧美成人一区在线| 欧美日韩福利在线观看| 国产亚洲日本欧美韩国| 97av在线视频免费播放|