Linux下进程间通信-------管道通信
生活随笔
收集整理的這篇文章主要介紹了
Linux下进程间通信-------管道通信
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
先來看原理:
?特點 :
1.半雙工的通信方式(通信期間雙方都可以發送/接收文件,但是不能雙方同時發送/接收數據)
2.pipe只能用于父子進程間的通信
3.mkfifo可用于任意進程間的通信
代碼逐步實現
首先創建管道文件:
?然后ls查看是否創建(因為我提前都寫過了,所有文件夾中寫端和讀端都有了)
?然后進行寫端的編寫:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
#include <signal.h>void sig_fun(int sig)//當讀端或寫端其中一方出錯時不會直接終止掉程序 而是返回一個信號值
{printf("sig = %d \n",sig);
}int main()
{signal(SIGPIPE,sig_fun);int fdw = open("fifo",O_WRONLY);//打開管道文件 只寫權限(該代碼是以任意兩進程間通信為例)assert(fdw != -1);while(1)//循環寫入程序{printf("fdw = %d\n",fdw);char buff[128] = {0};//將寫入的數據存到buff中printf("inputs:\n");fgets(buff,128,stdin);if(strncmp(buff,"end",3) == 0)//如果輸入"end"則終止掉程序{break;}write(fdw,buff,strlen(buff));//將數據寫入管道文件中}close(fdw); //關閉文件描述符exit(0);}
讀端的編寫:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>int main()
{int fdr = open("fifo",O_RDONLY);//從管道文件中讀取數據 只讀assert(fdr != -1);printf("fdr = %d \n",fdr);while(1){char buff[128] = {0};int n = read(fdr,buff,127);if(n == 0) //當寫端GG的時候 讀端沒有讀取到數據 然后讀端跟著一起GG{break;}printf(" \n buff = %s \n,n = %d \n",buff,n);}close(fdr);//exit(0);}
然后上述代碼是任意兩進程間的通信
使用的創建命令是mkfifo
然后下面來看pipe(父子進程間的通信)
先通過詳細命令man pipe可以看到:
?pipe需要傳入兩個文件描述符:fd[0]是讀的文件描述符
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?fd[1]是寫的文件描述符
下面來看代碼實現:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<assert.h>int main()
{int fd[2];\\fd[0] 讀 fd[1] 寫int res = pipe(fd);assert(res != -1);pid_t pid = fork();assert(pid != -1);if(pid == 0) //pid == 0 是在子進程那塊{close(fd[1]);char buff[128] = {0};read(fd[0],buff,127);printf("child read:%s\n",buff);close(fd[0]);} else //否則就在父進程那塊{close(fd[0]);char buff[128] = {0};fgets(buff,128,stdin); write(fd[1],buff,strlen(buff));close(fd[1]);}
}
該代碼在執行之后,父子進程都在阻塞,父進程在等待輸入fgets那塊阻塞,子進程在read那塊阻塞,然后你在輸入之后,回車,子進程就會讀出數據!
“如果你的長大還讓父母那么勞累,那么你長大的意義是什么!”
總結
以上是生活随笔為你收集整理的Linux下进程间通信-------管道通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “岸暗鸟栖后”下一句是什么
- 下一篇: Linux编程题:信号量同步三进程依次打