簡述進程間通信方式

???? 進程間通信方式通常有共享內存 信號量 消息隊列 管道 FIFO Socket等幾種。??

???? 共享內存的模型,它是最有效率的進程間通信方式
???? 進程間信號量是進程間同步主要方式,信號量操作為負的時候,進程阻塞。直到信號量為正???
???? 內存映射是一種特殊的共享內存方式,只是本質上是對文件的操作
???? 管道是親戚進程間通信的常用方式,常用于輸入輸出重定向???
???? Fifo也成為命名管道,可用于無關聯進程之間
???? Socket是唯一一個不同主機間進程通信的方式
下面簡單介紹一下他們的特點與功能

????????????? 共享內存(分配 綁定 脫離 釋放)

1:效率高,特別是大數據量通信

2:各進程需要協調共同的鍵值,需要提供額外機制防止競爭條件

3:異步通信

4:和信號量一同使用

?????????????????? 內存映射(多進程共享文件進行通信的機制)

?????????????????? 1:分配內存

???????????????????2:讀入文件內容至內存

?????????????????? 3:內存的內容回寫到文件

????????????? 信號量

1:線程信號量:同步多線程環境的計數器。

2:進程間同步的信號量: System V信號量,操作和sharedmemory類似。

????????????? 消息隊列

1打開或創建消息隊列

2讀寫操作

3獲得或設置隊列屬性

????????????? 管道

1:單向信息的傳遞設備

2:用于進程的線程之間或者是父子進程之間通信

3:自動同步進程(管道的容量是有限的當管道寫滿的時候,寫入端自動阻塞管道容量4096字節)

?

????????????? FIFO

1:在文件系統中是一個有名字的管道

2:任何進程都可以打開

3:進程間無需關聯

?

????????????? SocketSocket

1:是一種雙向通信設備

2:同一主機不同進程間通信

3:不同主機間的通信

????以下是一些程序,幫助大家理解

?共享內存

#include"stdio.h"

????? #include"sys/shm.h"

????? #include"string.h"

????? #include"fcntl.h"

????? #include"sys/stat.h"

????? int main()

????? {

????????? pid_t pid;

??????? ??int share_id;

????????? share_id=shmget(IPC_PRIVATE,getpagesize(),IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR );

????????? pid=fork();

????????? if(pid==0)

????????? {

?????????????? char *share1=NULL;

?????????????? share1=(char*) shmat (share_id, 0,0);

? ?????????????memset(share1,0,getpagesize());

?????????????? strcpy(share1,"hello,everyone\n");

?????????????? shmdt(share1);

????????? }

????????? else if(pid>0)

????????? {

??????????????? char *share2=NULL;

??????????????? share2=(char*) shmat(share_id,0,0);

??????????????? printf("read characters from memory!\n");

??????????????? printf("%s\n",share2);

??????????????? shmdt(share2);

??????????????? shmctl(share_id,IPC_RMID,0);

????????? }

????????? ?return 1;

????? }

信號量

???? #include <sys/types.h>

???? #include <sys/ipc.h>

???? #include <sys/sem.h>

???? #include<stdio.h>

???? #include<sys/stat.h>

???? #include<fcntl.h>

???? #include<unistd.h>

???? #define MAX 3

???? union semun

??? {

??????? int val;

??????? struct semid_ds *buf;

??????? unsigned short int *array;

??????? struct seminfo *_buf;

??? };

??? int sig_alloc(key_t key, int sem_flags)

??? {

??????? return semget (key, MAX, sem_flags);

??? }

?

??? int sig_destory (int semid,int numth)

??? {

??????? union semun ignored_argument;

??????? return semctl (semid, numth, IPC_RMID,ignored_argument);

??? }

/*

??????? parray is a set of initialized value

*/

??? int sig_init (int semid,int *parray)

?? {

??????? union semun argument;

??????? int i=0;

??????? for(i=0;i<MAX;i++)

??????? {

??? ????//????? values[i] = *(parray+i);??

??????????????? argument.array = parray;

??????????????? semctl (semid, i, SETALL, argument);

??????? }

?? }

?? int sig_wait(int semid,int numth)

?? {

??????? struct sembuf operations[MAX];

??????? operations[numth-1].sem_num = numth-1;

??????? operations[numth-1].sem_op = -1;

??????? operations[numth-1].sem_flg = SEM_UNDO;

??????? return semop(semid,operations,1);

?? }

?

?int sig_post(int semid,int numth)

?? {

??????? struct sembuf operations[MAX];

??????? operations[numth-1].sem_num = numth-1;

??????? operations[numth-1].sem_op = 1;

??????? operations[numth-1].sem_flg = SEM_UNDO;

??????? return semop(semid,operations,1);

?? }

int main()

?? {

??????? pid_t pid;

??????? int sig_id,i=0;

??????? int sig_val[MAX]={1,0,0};

??????? sig_id=sig_alloc(0,IPC_CREAT);

??????? sig_init(sig_id,sig_val);

??????? pid=fork();

??????? if(pid==0)

??????? {

??????????????? while(++i<10)

??????????????? {

??????????????????????? sig_wait(sig_id,3);

??????????????????????? printf("*************** \n");

??????????????????????? sig_post(sig_id,3);

??????????????? }

??????? }

else if(pid)

??????? {

??????????????? i=0;

??????????????? while(++i<10)

??????????????? {

??????????????????????? sig_wait(sig_id,1);

??????????????????????? printf("++++++++++++++++\n");

??????????????????????? sig_post(sig_id,1);

??????????????? }

?

? ??????}

??????? return 1;

??? }

內存映射

#include <sys/mman.h>

#include <sys/types.h>

#include<stdio.h>

#include<string.h>

#include<sys/stat.h>

#include<stdlib.h>

#include<fcntl.h>

#include<unistd.h>

#define FILE_LENGTH 100

int main(int argc,char **argv)

{

??????? int fd1,fd2;

??????? char *pfile=NULL;

??????? char *load=NULL;

??????? int num;

??????? if(argc<3)

??????? {

??????????????? printf("please input more file\n");

??????????????? return 0;

??????? }

?

??????? fd1=open(argv[1],O_RDONLY);

??????? fd2=open(argv[2],O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);

??????? printf("fd2=%d\n",fd2);

?

??????? //fd2=open(argv[2],O_WRONLY);

??????? lseek (fd2, FILE_LENGTH+1, SEEK_SET);

??????? write (fd2, "", 1);

??????? lseek (fd2, 0, SEEK_SET);

??????? printf("num=%d\n",num);

??????? printf("fd2=%d\n",fd2);

?

??????? pfile=(char*)mmap(0,FILE_LENGTH,PROT_WRITE|PROT_READ,MAP_PRIVATE,fd2,0);

??????? read(fd1,pfile,FILE_LENGTH);

??????? write(fd2,pfile,FILE_LENGTH);

??????? close(fd2);

??????? printf("pfile=%d\n",pfile);

??????? munmap(pfile,FILE_LENGTH);

??????? close(fd1);

??????? return 1;

}

? 管道

???? #include <sys/mman.h>

???? #include <sys/types.h>

???? #include<stdio.h>

???? #include<string.h>

???? #include<sys/stat.h>

???? #include<stdlib.h>

???? #include<fcntl.h>

???? #include<unistd.h>

?? int main ()

?? {

??? int fds[2];

??? pid_t pid;

??? pipe (fds);

??? pid = fork ();

??? if (pid == (pid_t) 0)

??? {

????? char str[10000];

????? sleep(1);

????? close(fds[1]);

????? read(fds[0],str,10000);

????? printf("%s",str);

????? close(fds[0]);

??? }

??? else if(pid>0)

??? {

??????? FILE*fp;

??????? char a[80];

??????? close(fds[0]);

??????? fp=(fopen("copy1.c","r"));

??????? if(fp==NULL)

??????? {

?????????? printf("can not open!!");

?????????? exit(0);

??????? }

??????? else

??????? {

??????? while(1)

??????? {

????????? if(fread(a,80,1,fp)==0) break;

????????? write(fds[1],a,sizeof(a));

??????? }

??????? }

????????? wait();

????????? close(fds[1]);

????????? fclose(fp);

????????? return 0;

??? }

轉載于:https://www.cnblogs.com/3ddan/p/3251979.html

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

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

相關文章

輔助的寫與數據庫交互的XML文件的類

現在企業級WEB應用中與數據庫交互的XML文件都是通過插件自動生成的&#xff0c;不過有些時候修改比較老的項目的時候也是需要手動的來做這一動作的&#xff01;如下代碼就是一個實現上述的功能的輔助類&#xff0c;在此記錄一下以備后用&#xff01; package com.cn.common.uti…

160 - 8 Andrnalin.1

環境&#xff1a; Windows xp sp3 打開&#xff0c;就一個Key輸入框&#xff0c;輸入&#xff1a;goodname&#xff0c;點OK&#xff0c;彈出一個 不明文字的框&#xff0c;反正肯定不對。 查殼&#xff0c;無殼的vb程序。OD載入&#xff1a; 查找字串&#xff0c;翻到最下…

C++ 虛函數表解析

C 虛函數表解析 陳皓 http://blog.csdn.net/haoel 前言 C中的虛函數的作用主要是實現了多態的機制。關于多態&#xff0c;簡而言之就是用父類型別的指針指向其子類的實例&#xff0c;然后通過父類的指針調用實際子類的成員函數。這種技術可以讓父類的指針有“多種形態”&#x…

160 - 9 Andrnalin.2

環境&#xff1a; Windows xp sp3 打開&#xff0c;這次升級了&#xff0c;有個Name和一個Key&#xff0c;輸入&#xff1a; Name&#xff1a;goodname Key&#xff1a;12345678 肯定錯誤。拿到錯誤信息的字符串 查殼&#xff0c;無殼的VB程序。 直接OD載入&#xff0c;字…

[PALAPALA] 無題 - 外來的和尚會念經

手機, 現代人響當當的必須品, 尤其在移動App流行的大環境之下顯得更為重要. 我, 并不是一個重度依賴手機的機粉. 但我對手機的差異化敏感度很高... 安卓手機, 我不喜歡, 因為滿大街泛濫&#xff0c;折騰過多... 蘋果手機, 我不喜歡, 因為滿大街泛濫&#xff0c;bug過多..... 相…

HTTP協議 (四) 緩存

HTTP協議 (四) 緩存 閱讀目錄 緩存的概念緩存的好處Fiddler可以方便地查看緩存的header如何判斷緩存新鮮度通過最后修改時間&#xff0c;判斷緩存新鮮度與緩存相關的headerETag瀏覽器不使用緩存直接使用緩存&#xff0c;不去服務器端驗證如何設置IE不使用緩存公有緩存和私有緩存…

160 - 10 Andrénalin.3

環境&#xff1a; Windows xp sp3 打開&#xff0c;是只有一個key&#xff0c;輸入個goodname試試&#xff0c;錯誤。。。記下錯誤信息 查殼&#xff0c;無殼的VB程序。 查找字符串&#xff1a; 00402036 UNICODE "kXy^rO|*yXo*m\kMuOn*" 00402090 UNICODE &qu…

160 - 11 Andrnalin.4

環境&#xff1a; Windows xp sp3 打開&#xff0c;這次的界面炫酷多了&#xff0c;就像輸保險箱密碼。 旁邊一個“UNREGISTRIERT”表示還沒注冊 輸入個666666&#xff0c;沒反應又沒有確認按鈕&#xff0c;可以猜測是用timer來檢測輸入的正確性 查殼&#xff0c;無殼的VB程…

ZooKeeper啟動過程2:FastLeaderElection

前一篇文章中說到&#xff0c;啟動ZooKeeper集群時&#xff0c;需要分別啟動集群中的各個節點&#xff0c;各節點以QuorumPeer的形式啟動&#xff0c;最后到達startLeaderElection和lookForLeader。 先說startLeaderElection 首先&#xff0c;初始化節點自身的currentVote【當前…

C++編程調試秘笈(第1次閱讀)

閱讀時間&#xff1a; 2017-4-17 --- 2017-4-19 第一次閱讀《C編程調試秘笈》&#xff0c;可能是因為對項目開發的經驗不足&#xff08;最近只是在做簡單的五子棋&#xff09;&#xff0c;使得對里面很多的知識點了解得不是很深。 《C編程調試秘笈》講的內容個人覺得與調試的技…

Web Component 文章

周末無意中了解了Web Component的概念。 http://blog.amowu.com/2013/06/web-components.html http://www.v2ex.com/t/69389 http://www.infoq.com/cn/news/2013/06/webcomponents Shadow DOM http://www.toobug.net/article/what_is_shadow_dom.html http://www.html5rocks.co…

遮罩效果 css3

CSS3提供了遮罩效果&#xff0c;這是以前CSS2中比較難實現的一個新特性&#xff0c;配合SVG或者canvas同樣也可以實現遮罩效果&#xff0c;他的效果就如下圖所示: 簡單的說就是在一個層上面加一個過濾層&#xff0c;過濾層透明度越低&#xff0c;底層就顯示的越多&#xff0c;反…

調試九法(第1次閱讀)

閱讀時間&#xff1a; 2017年4月19日 --- 2017年4月22日 第一次看到這本書的時候&#xff0c;是在網上看到它被評論得十分優秀&#xff0c;只要掌握了書中的方法&#xff0c;就能找到所有的BUG。我就是這樣被吸引過來的。 因為是調試9法&#xff0c;所以總共講了調試的時候注意…

Oracle11g密碼區分大小寫導致database link無法連接

Oracle11g的密碼默認是區分大小寫的&#xff0c;該特性通過初始化參數sec_case_sensitive_logon控制&#xff0c;默認TRUE表示區分大小寫。但是Oracle11g之前的版本密碼都是不區分大小寫的&#xff0c;所以在Oracle10g等以前版本創建到Oracle11g的database link時&#xff0c;可…

OC-深淺復制

【OC學習-26】對象的淺拷貝和深拷貝——關鍵在于屬性是否可被拷貝 對象的拷貝分為淺拷貝和深拷貝&#xff0c;淺拷貝就是只拷貝對象&#xff0c;但是屬性不拷貝&#xff0c;拷貝出來的對象和原來的對象共用屬性&#xff0c;即指向同一個屬性地址。深拷貝則相當于不僅拷貝了一個…

計算機科學導論(第一次閱讀)

時間&#xff1a; 2017年4月22日----2017年4月26 這是一本計算機入門書籍&#xff0c;粗略地描述了計算機各個方面的內容。當然對于一些十分復雜的知識&#xff0c;也僅僅是大概描述了這方面知識的一些了解知識。

配置SQLServer,允許遠程連接

需要別人遠程你的數據庫&#xff0c;首先需要的是在一個局域網內&#xff0c;或者連接的是同一個路由器&#xff0c;接下來就是具體步驟&#xff1a; &#xff08;一&#xff09;首先是要檢查SQLServer數據庫服務器中是否允許遠程鏈接。其具體操作為&#xff1a; &#xff08;1…

彈出打開/保存文件對話框 選擇文件夾對話框

打開/保存文件對話框: CFileDialog::CFileDialog(BOOL bOpenFileDialog, //為TRUE則顯示打開對話框&#xff0c;為FALSE則顯示保存對話文件對話框LPCTSTR lpszDefExt NULL, //默認的文件擴展名LPCTSTR lpszFileName NULL, //默認的文件名DWORD dwFlags OFN_HIDEREADONLY | O…

SharePoint 2013的100個新功能之網站管理(一)

一&#xff1a;設置盤 網站操作現在被替換為新的&#xff08;設置&#xff09;盤子。一些新的操作像添加一個應用、添加一個頁面或設計管理器被添加而像創建網站則從菜單中移除了。 二&#xff1a;移除以其他用戶身份登錄 在SharePoint 2013中&#xff0c;從用戶歡迎菜單中移除…

160 - 13 badboy

偷懶了很久也是時候要繼續開始學習了。 環境&#xff1a; windows xp sp3 工具&#xff1a; VB Decompiler v8.3 這次是個vb文件&#xff0c;所以嘗試一下用這個的感覺。 打開文件之后發現有兩個CrackMe選擇&#xff0c;分別是1.0版本和2.0版本。 打開vb decompiler&#…