日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

Linux下进程间通信-------管道通信

發布時間:2023/11/27 生活经验 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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下进程间通信-------管道通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。