程序沒有仔細測試,如果有BUG請留言,謝謝!
//pipe.h #ifndef __HEAD_H #define __HEAD_H #define BUFSIZE 4000 //讀寫標誌 typedef enum { READ, WRITE }RDWRFLAG; //緩衝區和控制標誌 typedef struct { char buf[BUFSIZE]; int head; int tail; int existnum;//緩衝區中存在待讀取的數據的個數 pid_t rpid; pid_t wpid; } PIPE; //創建自己的PIPE int createPipe(PIPE** pip); //設置進程的讀寫標誌,每個進程要麼只讀,要麼只寫 void setRDWRflag(PIPE *pip, RDWRFLAG flag); //每次從緩衝區中讀取一個byte的數據 int readAbye(PIPE* pip, int* c); //每次向緩衝區中寫入一個byte的數據 int writeAbye(PIPE* pip, int c); //從緩衝區中讀取數據 int readPipe(PIPE *pip, char *buf, int size); //向緩衝區中寫入數據 int writePipe(PIPE *pip, const char *buf, int size); //銷燬自己的PIPE int closePipe(PIPE *pip); #endif
//pipe.c //使用mmap實現父子進程間通信 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/mman.h> #include <sys/types.h> #include "pipe.h" //創建共享區 int createPipe(PIPE** pip) { *pip=(PIPE*)mmap(NULL, sizeof(PIPE), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0 ); if( MAP_FAILED==*pip ) { perror("mmap"); return -1; } (*pip)->head=0; (*pip)->tail=0; (*pip)->existnum=0; return 0; } //設置調用進程的讀寫屬性,一個進程要麼是讀,要麼是寫 void setRDWRflag(PIPE* pip, RDWRFLAG flag) { if( READ==flag ) { pip->rpid=getpid(); } else { pip->wpid=getpid(); } } //從共享緩衝區中讀取一個數據 int readAbye(PIPE* pip, int* c) { if( 0==pip->existnum )//當緩衝區爲空時,返回讀錯誤 { return -1; } else { *c=(pip->buf)[pip->head]; (pip->existnum)--; if( ++(pip->head)==BUFSIZE ) { pip->head=0; } return 0; } } //向共享緩衝區中寫入一個數據 int writeAbye(PIPE* pip, int c) { //緩衝區已滿,無法寫入 if( BUFSIZE==pip->existnum ) { return -1; } else { (pip->buf)[pip->tail]=c; (pip->existnum)++; if( BUFSIZE==++(pip->tail) ) { pip->tail=0; } return 0; } } int readPipe(PIPE* pip, char* buf, int size) { int i=0; int cnt=size; int c; if( getpid()!=pip->rpid ) { return -1; } while( cnt-- ) { if( -1!=readAbye(pip, &c) ) { buf[i++]=c; } else { break; } } if( cnt==0 ) { return size; } else { return i; } } int writePipe(PIPE* pip, const char* buf, int size) { int i=0; int cnt=size; if( getpid()!=pip->wpid ) { return -1; } while( cnt-- ) { if( -1==writeAbye(pip, buf[i++]) ) { break; } } if( 0==cnt ) { return size; } else { return i; } } int closePipe(PIPE* pip) { return munmap(pip, sizeof(PIPE)); } //測試代碼 int main(int argc, char *argv[]) { char srcbuf[20]="Hello World!"; char desbuf[20]; memset(desbuf, 0, 20); pid_t pid; PIPE* pip=NULL; if( -1==createPipe(&pip) ) { printf("createPipe error!/n"); exit(1); } pid=fork(); if( pid<0 ) { perror("fork"); exit(1); } else if( pid==0 )//設置子進程爲寫端 { setRDWRflag(pip, WRITE); if( -1==writePipe(pip, srcbuf, 20) ) { printf("writePipe error!/n"); exit(1); } exit(0); } else//設置父進程爲讀端 { sleep(1); setRDWRflag(pip, READ); if( -1==readPipe(pip, desbuf, 20) ) { printf("readPipe error!/n"); exit(1); } printf("%s/n", desbuf); } closePipe(pip); exit(0); }
1)編碼 消息長度(short int-->2個字節) + 消息編號(short int--》2個字節) + 消息體 2)Protobuf協議文檔 (1)syntax="proto3"; (2)命名格式
這個其實是一個特別高頻的面試題,松哥也一直很想和大家仔細來聊一聊這個話題,網上關於這塊的文章很多,但是我一直覺得要把這個問題講清楚還有點難度,今天我來試一試,看能不能和小夥伴們把這個問題梳理清楚,當然,如果小夥伴們覺得看文章不過癮,松哥也有
分享8個開箱即用的API,方便日常處理集合。 1. 快速過濾空值:Stream.ofNullable 該方法是在 Java 9 中引入的,有助於過濾集合中的所有空值,從而可能使我們避免空指針異常。 在下面的示例中,有一個包含 null 的L
一、背景 在日常部門OpsReview過程中,部門內多次遇到應用容器所在的宿主機磁盤繁忙導致的接口響應緩慢,TP99增高等影響服務性能的問題,其中比較有效的解決方案是開啓日誌的異步打印,可以有效避免同步日誌打印在磁盤IO高起的情況下拖慢業
本文分享自華爲雲社區《【MySQL技術專欄】MySQL8.0直方圖介紹》,作者:GaussDB 數據庫。 背景 數據庫查詢優化器負責將SQL查詢轉換爲儘可能高效的執行計劃,但因爲數據環境不斷變化導致優化器對查詢數據瞭解的不夠充足,可能無法
每篇一句 大魔王張怡寧:女兒,這堆金牌你拿去玩吧,但我的銀牌不能給你玩。你要想玩銀牌就去找你王浩叔叔吧,他那銀牌多 前言 爲了講述好Spring MVC最爲複雜的數據綁定這塊,我前面可謂是做足了功課,對此部分知識此處給小夥伴留一個學
作者:vivo 互聯網數據庫團隊- Qiu Xinbo 本文主要通過圖示介紹了用主鍵進行分片查詢的過程,介紹了主鍵分頁查詢存在SQL性能問題,如何去創建高效的索引去優化主鍵分頁查詢的SQL性能問題 對於數據分佈不均
JSON簡介: JSON(Java Script Object Notation)是一種輕量級的數據交換格式,通常用於在不同系統之間傳輸數據。它基於 JavaScript 對象語法,但已成爲一種獨立於語言的格式。JSON 數據以鍵值對的形式
一、簡單介紹: CaffeineCache和Guava的Cache是應用廣泛的本地緩存。 在開發中,爲了達到降低依賴、提高訪問速度的目的。會使用它存儲一些維表接口的返回值和數據庫查詢結果,在有些場景下也會在分佈式緩存上再加上一層本地緩存,
作者:vivo 互聯網大前端團隊 - Ma Lian 本文主要描述了FileProvider,startAnyWhere實現,Parcel不對稱漏洞以及這三者結合產生的漏洞利用實戰,另外闡述了漏洞利用的影響和修復預防措施,這個漏洞波及了
本文分享自華爲雲社區《GaussDB SQL基本語法示例-CASE表達式》,作者:Gauss松鼠會小助手2。 一、前言 SQL是用於訪問和處理數據庫的標準計算機語言。GaussDB支持SQL標準(默認支持SQL2、SQL3和SQL4的主要
Impala目前支持Hadoop中幾種常見的文件格式 Parquet 、 ORC 、 Text 、 Avro 、 RCFile 和 SequenceFile 。下面簡要說明各種格式的使用、限制和一些注意事項。 不同的文件格式有着不同的適用場
本文分享自華爲雲社區《GaussDB SQL基礎語法示例-BOOLEAN表達式》,作者:Gauss松鼠會小助手2。 一、前言 SQL是用於訪問和處理數據庫的標準計算機語言。GaussDB支持的SQL標準(默認支持SQL2、SQL3和SQL
Map是用於保存具有映射關係的數據集合,它具有雙列存儲的特點,即一次必須添加兩個元素,即一組鍵值對<Key,Value>,其中Key的值不可重複(當Key的值重複的時候,後面插入的對象會將之前插入的具有相同的Key值的對象覆蓋掉),Valu
前端面試題 - null是原始類型,但爲什麼typeof null的結果是object? 造成這個結果的原因是null的內存地址是以000開頭,而js會將000開頭的內存地址視爲object。 通過isNull()來判斷一個值是不是null