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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux系统编程(三)进程间的通信

發(fā)布時(shí)間:2023/11/30 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux系统编程(三)进程间的通信 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Linux系統(tǒng)編程(三)進(jìn)程間的通信

  • 一、為什么需要進(jìn)程之間的通信(IPC)?
  • 二、管道
    • 1.概念
    • 2.特質(zhì)
    • 3.原理
    • 4.局限性
    • 5.代碼
    • 2.讀入數(shù)據(jù)
  • 三、共享存儲(chǔ)映射
    • 注意事項(xiàng)
    • 父子進(jìn)程通信

一、為什么需要進(jìn)程之間的通信(IPC)?

當(dāng)我們編碼時(shí)會(huì)發(fā)現(xiàn)我們使用全局變量并不能在父子進(jìn)程之間使用,這是為什么呢?是因?yàn)檫M(jìn)程與進(jìn)程之間是相互獨(dú)立,當(dāng)我們?cè)谥鬟M(jìn)程當(dāng)中修改那個(gè)全局變量的時(shí)候,子進(jìn)程的并不會(huì)變,因?yàn)閮烧哂脩?hù)空間的那塊地址是不一樣的。這時(shí)候我們引入了IPC,它是在內(nèi)核創(chuàng)建了一個(gè)緩沖區(qū),進(jìn)程通過(guò)這個(gè)緩沖區(qū)實(shí)現(xiàn)進(jìn)程之間的通信。

二、管道

1.概念

管道是一種最基本的IPC機(jī)制,作用于有血緣關(guān)系的進(jìn)程之間,完成數(shù)據(jù)傳遞。調(diào)用pipe系統(tǒng)函數(shù)即可創(chuàng)建一個(gè)管道。

2.特質(zhì)

1.管道的本質(zhì)是一個(gè)偽文件,不占用磁盤(pán)資源
2.由兩個(gè)文件描述符引用,一個(gè)表示讀端,一個(gè)表示寫(xiě)段
3.數(shù)據(jù)從管道寫(xiě)段流入,讀端流出

3.原理

管道內(nèi)核使用環(huán)形隊(duì)列機(jī)制,借助內(nèi)核緩沖區(qū)(4k)實(shí)現(xiàn)

4.局限性

1.數(shù)據(jù)不能自己讀自己寫(xiě)
2.數(shù)據(jù)一旦被讀走,便不在管道中存在,不可重復(fù)讀取
3.由于管道采用半雙工通信方式。數(shù)據(jù)只能一個(gè)方向上流動(dòng)
4.只能在由公共祖先的進(jìn)程間使用管道

5.代碼

代碼如下(示例):

#include <cstdio> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h>int main() {pid_t pid;int fd[2];int ret=pipe(fd);if (ret == -1){perror("pipe error:");exit(1);}pid = fork();if(pid==-1){ perror("pipe error:");exit(1);}else if (pid == 0) //子進(jìn)程{sleep(1);close(fd[1]);char buf[1024];ret=read(fd[0], buf, sizeof(buf));if (ret == 0){printf("-----------\n");}write(STDOUT_FILENO,buf,ret);}else{close(fd[0]);char* str = "hello";write(fd[1], "hello pipe\n", strlen("hello pipe\n"));wait(NULL);}return 0; }

2.讀入數(shù)據(jù)

代碼如下(示例):

data = pd.read_csv('https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv') print(data.head())

該處使用的url網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù)。


三、共享存儲(chǔ)映射

注意事項(xiàng)

1.創(chuàng)建映射區(qū)的過(guò)程中,隱含著一次對(duì)映射文件的讀操作。
2. 當(dāng)MAP_SHARED時(shí),要求:映射區(qū)的權(quán)限應(yīng) <=文件打開(kāi)的權(quán)限(出于對(duì)映射區(qū)的保護(hù))。而MAP_PRIVATE則無(wú)所謂,因?yàn)閙map中的權(quán)限是對(duì)內(nèi)存的限制。
3. 映射區(qū)的釋放與文件關(guān)閉無(wú)關(guān)。只要映射建立成功,文件可以立即關(guān)閉。
4. 特別注意,當(dāng)映射文件大小為0時(shí),不能創(chuàng)建映射區(qū)。所以:用于映射的文件必須要有實(shí)際大小!! mmap使用時(shí)常常會(huì)出現(xiàn)總線(xiàn)錯(cuò)誤,通常是由于共享文件存儲(chǔ)空間大小引起的。
5. munmap傳入的地址一定是mmap的返回地址。堅(jiān)決杜絕指針++操作。
6. 如果文件偏移量必須為4K的整數(shù)倍
7. mmap創(chuàng)建映射區(qū)出錯(cuò)概率非常高,一定要檢查返回值,確保映射區(qū)建立成功再進(jìn)行后續(xù)操作。

父子進(jìn)程通信

```csharp #include <cstdio> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/wait.h>int main() {//實(shí)現(xiàn)父子進(jìn)程之間的通信int* p;int var = 100;pid_t pid;int fd = open("temp",O_CREAT|O_RDWR,0644);if (fd < 0 ){perror("open error:");exit(1);}//unlink("temp");ftruncate(fd,4);p=(int*)mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);if (p == MAP_FAILED){perror("mmap error:");exit(1);}//關(guān)閉文件close(fd);//創(chuàng)建子線(xiàn)程pid = fork();if (pid == 0){*p = 2000;var = 1000;printf("child,p = %d,var = %d\n",*p,var);}else if(pid > 0){sleep(1);printf("parent,p = %d,var = %d\n", *p, var);wait(NULL);//釋放映射區(qū)int ret = munmap(p,4);if (ret == -1){perror("munmap error:");exit(1);}}return 0; }

總結(jié)

以上是生活随笔為你收集整理的Linux系统编程(三)进程间的通信的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。