Linux系統編程(三)進程間的通信

Linux系統編程(三)進程間的通信

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

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

當我們編碼時會發現我們使用全局變量并不能在父子進程之間使用,這是為什么呢?是因為進程與進程之間是相互獨立,當我們在主進程當中修改那個全局變量的時候,子進程的并不會變,因為兩者用戶空間的那塊地址是不一樣的。這時候我們引入了IPC,它是在內核創建了一個緩沖區,進程通過這個緩沖區實現進程之間的通信。

二、管道

1.概念

管道是一種最基本的IPC機制,作用于有血緣關系的進程之間,完成數據傳遞。調用pipe系統函數即可創建一個管道。

2.特質

1.管道的本質是一個偽文件,不占用磁盤資源
2.由兩個文件描述符引用,一個表示讀端,一個表示寫段
3.數據從管道寫段流入,讀端流出

3.原理

管道內核使用環形隊列機制,借助內核緩沖區(4k)實現

4.局限性

1.數據不能自己讀自己寫
2.數據一旦被讀走,便不在管道中存在,不可重復讀取
3.由于管道采用半雙工通信方式。數據只能一個方向上流動
4.只能在由公共祖先的進程間使用管道

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) //子進程{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.讀入數據

代碼如下(示例):

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

該處使用的url網絡請求的數據。


三、共享存儲映射

在這里插入圖片描述

注意事項

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

父子進程通信


```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()
{//實現父子進程之間的通信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);}//關閉文件close(fd);//創建子線程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);//釋放映射區int ret = munmap(p,4);if (ret == -1){perror("munmap error:");exit(1);}}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384414.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384414.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384414.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用mmap實現大文件的復制:單進程與多進程情況

單線程和多進程實現文件的復制&#xff08;mmap方法&#xff09; mmap實現大文件的復制單線程和多進程實現文件的復制&#xff08;mmap方法&#xff09;一、單線程實現二、多進程實現一般文件實現方法&#xff1a;1.讀取&#xff08;fread&#xff09;要復制的文件2.寫入&#…

exec 函數族

轉自&#xff1a;http://www.cnblogs.com/mickole/p/3187409.html linux系統編程之進程&#xff08;五&#xff09;&#xff1a;exec系列函數&#xff08;execl,execlp,execle,execv,execvp)使用 本節目標&#xff1a; exec替換進程映像exec關聯函數組&#xff08;execl、execl…

Linux系統編程(四)信號

Linux系統編程&#xff08;四&#xff09;信號一、什么是信號&#xff1f;1、信號的本質2、信號來源硬件來源軟件來源二、常見信號1.可靠信號和不可靠信號2、不可靠信號主要有以下問題:3、可靠信號與不可靠信號注冊機制三、信號處理方式四、信號處理過程五、未決信號和阻塞信號…

SIGCHLD信號回收子進程

SIGCHLD信號回收子進程代碼問題注意點代碼 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h>void handler(int signo) {int status; pid_t pid;while ((pid waitpid(0, &status…

Wait waitpid

轉自&#xff1a;http://www.cnblogs.com/mickole/p/3187770.html linux系統編程之進程&#xff08;六&#xff09;&#xff1a;父進程查詢子進程的退出,wait,waitpid 本節目標&#xff1a; 僵進程SIGCHLDwaitwaitpid 一&#xff0c;僵尸進程 當一個子進程先于父進程結束運行時…

Linux系統編程(五)時序競態

時序競態產生原因改進總結產生原因 #include <cstdio> #include <stdio.h> #include <sys/time.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <errno.h>void catch_sigalrm(int signo) {printf("…

Linux C++ 簡單爬蟲

轉載&#xff1a;http://blog.csdn.net/orthocenterchocolate/article/details/38665937 方便易用&#xff0c;傳入URL&#xff0c;返回對應頁面的內容 [cpp] view plaincopy #include <iostream> #include <string> #include <netdb.h> #include <…

Linux系統編程(六)守護進程

Linux系統編程&#xff08;六&#xff09;守護進程一、進程組概念二、會話創建會話的條件守護進程概念守護進程模型創建守護進程一、進程組 概念 進程組&#xff0c;也稱之為作業。代表一個或多個進程的集合。每個進程都屬于一個進程組。 當父進程&#xff0c;創建子進程的時…

TCP 客戶端和服務器端

轉自&#xff1a;http://blog.csdn.net/itcastcpp/article/details/39047265 前面幾篇中實現的client每次運行只能從命令行讀取一個字符串發給服務器&#xff0c;再從服務器收回來&#xff0c;現在我們把它改成交互式的&#xff0c;不斷從終端接受用戶輸入并和server交互。 [cp…

利用多線程實現linux下C語言的聊天室程序:

轉載&#xff1a;http://www.360doc.com/content/16/0421/11/478627_552531090.shtml 利用多線程實現linux下C語言的聊天室程序&#xff1a; 客戶端代碼&#xff1a; threadsend線程負責客戶端消息的發送&#xff1b; threadrecv線程負責客戶端接受服務器端的消息。 [html] v…

Linux系統編程(七)消息隊列

Linux系統編程&#xff08;七&#xff09;消息隊列一、什么是消息隊列二、消息隊列內部原理三、實現消息隊列的收發1.發送消息隊列2.接收消息隊列四、消息隊列與命名管道的比較一、什么是消息隊列 消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。每個數據塊都…

基于Linux的SOCKET編程之TCP半雙工Client-Server聊天程序

轉自&#xff1a;http://blog.csdn.net/apollon_krj/article/details/53398448#0-tsina-1-64987-397232819ff9a47a7b7e80a40613cfe1 所謂半雙工通信&#xff0c;即通信雙方都可以實現接發數據&#xff0c;但是有一個限制&#xff1a;只能一方發一方收&#xff0c;之后交換收發對…

Linux系統編程(八)線程

Linux系統編程&#xff08;八&#xff09;線程一、什么是線程&#xff1f;二、Linux內核線程實現原理線程共享資源線程非共享資源線程優缺點線程控制原語一、什么是線程&#xff1f; LWP&#xff1a;light weight process 輕量級的進程&#xff0c;本質仍是進程(在Linux環境下…

智能算法(GA、DBO等)求解阻塞流水車間調度問題(BFSP)

先做一個聲明&#xff1a;文章是由我的個人公眾號中的推送直接復制粘貼而來&#xff0c;因此對智能優化算法感興趣的朋友&#xff0c;可關注我的個人公眾號&#xff1a;啟發式算法討論。我會不定期在公眾號里分享不同的智能優化算法&#xff0c;經典的&#xff0c;或者是近幾年…

Linux socket編程,對套接字進行封裝

轉自&#xff1a;http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html 下面是對socket操作的封裝&#xff0c;因為在Linux下寫中文到了windows里面會亂碼&#xff0c;所以注釋用英文來寫&#xff0c;有空再查下解決方法吧 socket.h #ifndef SOCKET_H #define SOCKET_…

Linux系統編程(九)線程同步

Linux系統編程&#xff08;九&#xff09;線程同步一、什么是線程同步&#xff1f;二、互斥量三、條件變量pthread_cond_wait函數pthread_cond_signal函數生產者和消費者模型一、什么是線程同步&#xff1f; 線程同步&#xff0c;指一個線程發出某一功能調用時&#xff0c;在沒…

linux網絡編程(一)網絡基礎傳輸知識

linux網絡編程&#xff08;一&#xff09;網絡傳輸基礎知識一、什么是協議&#xff1f;二、使用步驟典型協議2.網絡應用程序設計模式C/S模式B/S模式優缺點3.分層模型4.TCP/IP四層模型通信過程5.協議格式數據包封裝以太網幀格式ARP數據報格式IP段格式UDP數據報格式TCP數據報格式…

linux網絡編程:使用多進程實現socket同時收發數據

轉載&#xff1a;http://blog.csdn.net/li_wen01/article/details/52685844 前面已講過使用一個進程實現服務端和客戶端P2P通信的實例&#xff0c;但是它只能同時處理一個客戶端的連接。如果要實現并發處理多個客戶端的連接并且實現P2P通信&#xff0c;可以使用多進程來處理。相…

Linux 進程學習(四)------ sigaction 函數

轉自&#xff1a;http://www.cnblogs.com/wblyuyang/archive/2012/11/13/2768923.html 使用 sigaction 函數&#xff1a; signal 函數的使用方法簡單&#xff0c;但并不屬于 POSIX 標準&#xff0c;在各類 UNIX 平臺上的實現不盡相同&#xff0c;因此其用途受 到了一定的限制…

linux網絡編程(二)高并發服務器

linux網絡編程&#xff08;二&#xff09;高并發服務器錯誤處理高并發服務器多進程并發服務器客戶端錯誤處理 #include "wrap.h"int Bind(int fd, const struct sockaddr* sa, socklen_t salen) {int ret;if ((ret bind(fd, sa, salen)) < 0){perror("bind…