IO進程線程第6天

1.使用有名管道完成兩個進程的相互通信

send.c代碼如下:

#include <myhead.h>int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid>0){//父進程//從管道1中讀取數據int fd=-1;if((fd=open("./mkfifo1",O_RDONLY))==-1){perror("open error");return -1;}char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));//	printf("請輸入>>>:");//	fgets(wbuf,sizeof(wbuf),stdin);//	wbuf[strlen(wbuf)-1]=0;read(fd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit")==0){break;}printf("從程序A中讀取的數據:%s\n",rbuf);}close(fd);}else if(pid==0){//子進程 //向管道2中寫入數據int fd1=-1;if((fd1=open("./mkfifo2",O_WRONLY))==-1){perror("open error");return -1;}char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));//	printf("請輸入>>>:");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;write(fd1,wbuf,sizeof(wbuf));if(strcmp(wbuf,"quit")==0){break;}//	printf("程序B發送的消息:%s\n",rbuf);}close(fd1);}else{perror("fork error");return -1;}return 0;
}

recv.c代碼如下:

#include <myhead.h>int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid>0){//父進程//向管道1中寫入數據int fd=-1;if((fd=open("./mkfifo1",O_WRONLY))==-1){perror("open error");return -1;}char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));//	printf("請輸入>>>:");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;write(fd,wbuf,sizeof(wbuf));if(strcmp(wbuf,"quit")==0){break;}}close(fd);}else if(pid==0){//子進程 //從管道2中讀取數據int fd1=-1;if((fd1=open("./mkfifo2",O_RDONLY))==-1){perror("open error");return -1;}char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));read(fd1,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit")==0){break;}printf("程序B發送的消息:%s\n",rbuf);}close(fd1);}else{perror("fork error");return -1;}return 0;
}

create.c代碼如下:

#include <myhead.h>int main(int argc, const char *argv[])
{if(mkfifo("./mkfifo1",0664)==-1){perror("mkfifo error");return -1;}if(mkfifo("./mkfifo2",0664)==-1){perror("mkfifo error");return -1;}getchar();system("rm mkfifo1");system("rm mkfifo2");return 0;
}

運行結果:

2.關于互斥機制的代碼實現

#include <myhead.h>
int num=200;//定義一個鎖資源
pthread_mutex_t mutex;void *task1(void *arg)
{//對訪問的臨界資源進行上鎖pthread_mutex_lock(&mutex);num=120;printf("task1 num=%d\n",num);//解鎖pthread_mutex_unlock(&mutex);pthread_exit(NULL);
}void *task2(void *arg)
{//對訪問的臨界資源進行上鎖pthread_mutex_lock(&mutex);sleep(1);num++;printf("task2 num=%d\n",num);pthread_mutex_unlock(&mutex);pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{//初始化鎖pthread_mutex_init(&mutex,NULL);pthread_t tid1,tid2;if(pthread_create(&tid1,NULL,task1,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);//釋放鎖資源pthread_mutex_destroy(&mutex);return 0;
}

運行結果:

3.無名信號量的代碼實現如下 :

#include <myhead.h>
//實現無名信號量
//定義無名信號量
sem_t sem1,sem2,sem3;void *task1(void *arg)
{int num=5;while(num--){sem_wait(&sem1);printf("A");sem_post(&sem2);}pthread_exit(NULL);
}void *task2(void *arg)
{int num=5;while(num--){sem_wait(&sem2);printf("B");sem_post(&sem3);}pthread_exit(NULL);
}void *task3(void *arg)
{int num=5;while(num--){sem_wait(&sem3);printf("C\n");sem_post(&sem1);}pthread_exit(NULL);
}
/**************主程序******************/
int main(int argc, const char *argv[])
{//初始化無名信號量sem_init(&sem1,0,1);sem_init(&sem2,0,0);sem_init(&sem3,0,0);pthread_t tid1,tid2,tid3;if(pthread_create(&tid1,NULL,task1,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid3,NULL,task3,NULL)!=0){perror("pthread_create error");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);return 0;
}

運行結果:

4.實現條件變量代碼如下:

#include <myhead.h>
//定義一個條件變量
pthread_cond_t cond;
//定義一個互斥鎖
pthread_mutex_t mutex;
void *task1(void *arg)
{int num=5;while(num--){sleep(2);printf("tid1生產了一輛奔馳車\n");//喚醒等待隊列中的線程pthread_cond_signal(&cond);}pthread_exit(NULL);
}void *task2(void *arg)
{//上鎖pthread_mutex_lock(&mutex);pthread_cond_wait(&cond,&mutex);printf("消費了一輛車\n");//解鎖pthread_mutex_unlock(&mutex);pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//初始化條件變量pthread_cond_init(&cond,NULL);//初始化一個互斥鎖pthread_mutex_init(&mutex,NULL);pthread_t tid1,tid2,tid3,tid4,tid5,tid6;if(pthread_create(&tid1,NULL,task1,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid2,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid3,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid4,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid5,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}if(pthread_create(&tid6,NULL,task2,NULL)!=0){perror("pthread_create error");return -1;}//回收線程資源pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_join(tid3,NULL);pthread_join(tid4,NULL);pthread_join(tid5,NULL);pthread_join(tid6,NULL);//釋放鎖pthread_mutex_destroy(&mutex);//釋放條件變量pthread_cond_destroy(&cond);return 0;
}

運行結果:

5.無名管道代碼實現如下:

#include <myhead.h>int main(int argc, const char *argv[])
{int pipefd[2]={0};if(pipe(pipefd)==-1){perror("pipe error");return -1;}pid_t pid=fork();if(pid>0){//父進程close(pipefd[0]);char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));//	printf("請輸入>>>>");fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;write(pipefd[1],wbuf,sizeof(wbuf));if(strcmp(wbuf,"quit")==0){break;}}close(pipefd[1]);}else if(pid==0){//子進程close(pipefd[1]);char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));read(pipefd[0],rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit")==0){break;}printf("接收的內容為:%s\n",rbuf);}close(pipefd[0]);}else{perror("fork error");return -1;}return 0;
}

運行結果:

6.有名管道代碼實現如下:

create.c

#include <myhead.h>int main(int argc, const char *argv[])
{if(mkfifo("./mk",0664)==-1){perror("mkfifo error");return -1;}getchar();system("rm mk");return 0;
}

send.c

#include <myhead.h>int main(int argc, const char *argv[])
{if(mkfifo("./mk",0664)==-1){perror("mkfifo error");return -1;}getchar();system("rm mk");return 0;
}
ubuntu@ubuntu:home$ cat mkfifo.c 
#include <myhead.h>
//使用有名管道完成不同進程之間的通信
int main(int argc, const char *argv[])
{int wfd=-1;if((wfd=open("./mk",O_WRONLY))==-1){perror("open error");return -1;}char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;write(wfd,wbuf,sizeof(wbuf));if(strcmp(wbuf,"quit")==0){break;}}close(wfd);return 0;
}

recv.c

#include <myhead.h>int main(int argc, const char *argv[])
{int rfd=-1;if((rfd=open("./mk",O_RDONLY))==-1){perror("open error");return -1;}char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));read(rfd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit")==0){break;}printf("收到的消息:%s\n",rbuf);}close(rfd);return 0;
}

運行結果:

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

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

相關文章

【安卓基礎3】Activity(一)

&#x1f3c6;作者簡介&#xff1a;|康有為| &#xff0c;大四在讀&#xff0c;目前在小米安卓實習&#xff0c;畢業入職 &#x1f3c6;本文收錄于 安卓學習大全&#xff0c;歡迎關注 &#x1f3c6;安卓學習資料推薦&#xff1a; 視頻&#xff1a;b站搜動腦學院 視頻鏈接 &…

微信小程序開發教程:

準備工作 下載并安裝微信開發者工具注冊微信公眾平臺賬號并創建小程序項目 項目結構 app.js&#xff1a;小程序的入口文件&#xff0c;用于定義全局變量和函數app.json&#xff1a;小程序的全局配置文件&#xff0c;用于配置小程序的頁面、窗口樣式、網絡超時時間等app.wxss&am…

反光衣實時識別檢測系統-反光衣穿戴識別系統-智慧工地系統安全帽佩戴---豌豆云

反光衣實時識別檢測系統是根據視頻流的自動化圖像識別檢測&#xff0c;運用前沿的深度神經網絡與云計算技術&#xff0c;替代工作人員的眼睛。 在工地、化工廠、煤礦石化等生產安全地區部署反光衣實時識別檢測系統&#xff0c;運用現場已有的視頻監控可以無死角全自動檢測生產…

Sora橫空出世!AI將如何撬動未來?

近日&#xff0c;OpenAI 發布首個視頻生成“Sora”模型&#xff0c;該模型通過接收文字指令&#xff0c;即可生成60秒的短視頻。 而在2022年末&#xff0c;同樣是OpenAI發布的AI語言模型ChatGPT&#xff0c;簡化了文本撰寫、創意構思以及代碼校驗等任務。用戶僅需輸入一個指令&…

【IC設計】Chisel API之Arbiter和RRArbiter的使用

文章目錄 介紹Chisel的Valid和Ready流控build.sbtRRArbiter代碼示例 介紹 仲裁器在NoC路由器中是重要的組成部分&#xff0c;虛通道仲裁和交叉開關仲裁都需要使用仲裁器。 Chisel提供了Arbiter和RRArbiter仲裁器 Arbiter是基礎的低位優先仲裁器&#xff0c; RRArbiter初始情況…

前端構建效率優化之路

項目背景 我們的系統&#xff08;一個 ToB 的 Web 單頁應用&#xff09;前端單頁應用經過多年的迭代&#xff0c;目前已經累積有大幾十萬行的業務代碼&#xff0c;30 路由模塊&#xff0c;整體的代碼量和復雜度還是比較高的。 項目整體是基于 Vue TypeScirpt&#xff0c;而構…

ProtoBuf認識與Windows下的安裝

protobuf簡介 Protobuf 是 Protocol Buffers 的簡稱&#xff0c;它是 Google 公司開發的一種數據描述語言&#xff0c;是一種輕便高效的結 構化數據存儲格式&#xff0c;可以用于結構化數據&#xff0c;或者說序列化。它很適合做數據存儲 或 RPC 數據交換格 式 。可用于通訊…

WebServer -- 定時器處理非活動連接(上)

目錄 &#x1f34d;函數指針 &#x1f33c;基礎知識 &#x1f419;整體概述 &#x1f382;基礎API sigaction 結構體 sigaction() sigfillset() SIGALRM, SIGTERM 信號 alarm() socketpair() send() &#x1f4d5;信號通知流程 統一事件源 信號處理機制 &#x…

2024全球網絡安全展望|構建協同生態,護航數字經濟

2024年1月&#xff0c;世界經濟論壇發布《2024全球網絡安全展望》報告&#xff0c;指出在科技快速發展的背景下&#xff0c;網絡安全不均衡問題加劇&#xff0c;需加強公共部門、企業組織和個人的合作。 報告強調&#xff0c;面對地緣政治動蕩、技術不確定性和全球經濟波動&am…

基于springboot+vue的美發門店管理系統(前后端分離)

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Python 高級語法:一切皆對象

1 “一切皆對象”是一種核心設計哲學 在編程領域&#xff0c;特別是面向對象編程&#xff08;OOP&#xff09;中&#xff0c;“一切皆對象”是一種核心設計哲學。這種哲學主張&#xff0c;無論是數據、函數、還是更復雜的結構&#xff0c;都可以被視為對象&#xff0c;并賦予…

信息安全基本概念匯總

目錄 一、安全加密算法相關 二、信息安全需求規范相關 三、安全啟動 四、安全更新 五、安全通信SecOC 六、HSM安全固件整體架構 一、安全加密算法相關 基于Autosar的網絡安全理解_搜狐汽車_搜狐網 基于AES的CMAC算法、MAC、Hash、數字簽名之間的關系_aes cmac-CSDN博客…

Cartographer框架簡述

catographer框架分為前端和后端 前端包括雷達數據處理&#xff1b;位姿預測&#xff1b;掃描匹配和柵格地圖更新。 后端包括后端&#xff1a;線程池任務與調度&#xff1b;向位姿圖添加節點&#xff0c;計算節點的子圖內約束和子圖間約束&#xff08;回環檢測&#xff09;&…

C++之Easyx——圖形庫的基本功能(1):界面操作

最近&#xff0c;我覺得使用控制臺編寫游戲太沒意思了&#xff01;&#xff01; 所以我開始研究圖形庫了~ 一、setinitmode 函數定義 void EGEAPI setinitmode(int mode, int x CW_USEDEFAULT, int y CW_USEDEFAULT); //設置初始化模式&#xff0c;mode0為普通&#xff0c…

Spark中寫parquet文件是怎么實現的

背景 本文基于 Spark 3.5.0 寫本篇文章的目的是在于能夠配合spark.sql.maxConcurrentOutputFileWriters參數來加速寫parquet文件的速度&#xff0c;為此研究一下Spark寫parquet的時候會占用內存的大小&#xff0c;便于配置spark.sql.maxConcurrentOutputFileWriters的值&#…

Javascript怎么輸出內容?兩種常見方式以及控制臺介紹

javascript是一種非常重要的編程語言&#xff0c;在許多網頁中它被廣泛使用&#xff0c;可以實現許多交互效果和動態效果。輸出是javascript中最基本的操作之一&#xff0c;下面將介紹兩種常見的輸出方式。 一、使用console.log()函數輸出 console.log()函數是常用的輸出函數…

Jmeter實現階梯式線程增加的壓測

安裝相應jmeter 插件 1&#xff1a;安裝jmeter 管理插件&#xff1a; 下載地址&#xff1a;https://jmeter-plugins.org/install/Install/&#xff0c;將下載下來的jar包放到jmeter文件夾下的lib/ext路徑下&#xff0c;然后重啟jmeter。 2&#xff1a;接著打開 選項-Plugins Ma…

在Linux上安裝Docker: 一站式指南

Docker 是一款強大的容器化平臺&#xff0c;為開發者提供了一種輕松打包、發布和運行應用的方式。在本文中&#xff0c;我們將探討如何在Linux操作系統上安裝Docker&#xff0c;為你提供一站式指南。 步驟1: 卸載舊版本 在安裝新版Docker之前&#xff0c;建議先卸載舊版本&am…

三十年一個大輪回!日股突破“泡沫時期”歷史高點

2月22日周四&#xff0c;英偉達四季報業績超預期&#xff0c;而且本季度業績指引非常樂觀&#xff0c;提振美股股指期貨并成為芯片股和AI概念股情緒的重要催化劑。今日亞洲芯片股和AI股起飛&#xff0c;日本在芯片股的帶動下突破1989年泡沫時期以來的歷史最高收盤價。 美股方面…

我之前炒股虧麻了,找百融云AI Agent談了談心

春節之前&#xff0c;A股和H股都跌麻了&#xff0c;但是機構的路演和調研反而多了。因為&#xff1a;寫不完的安撫、說不完的陪伴、聽不完的客戶指責、以及撿不完的AH股便宜貨。 有一位血液里流淌著美式咖啡的職場白領&#xff0c;雖然這些年在股市過得很不如意&#xff0c;但…