IOday7作業

1> 使用無名管道完成父子進程間的通信

#include<myhead.h>int main(int argc, const char *argv[])
{//創建存放兩個文件描述符的數組int fd[2];int pid = -1;//打開無名管道if(pipe(fd) == -1){perror("pipe");return -1;}//創建子進程pid = fork();if(pid > 0){//父進程//關閉讀端close(fd[0]);char buf[128]="";while(1){printf("請輸入:");fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1] = 0;write(fd[1],buf,strlen(buf));if(strcmp(buf,"quit") == 0){break;}}close(fd[1]);}else if(pid == 0){//子進程close(fd[1]);char buf[128]="";while(1){bzero(buf,sizeof(buf));read(fd[0],buf,sizeof(buf));printf("輸出是:%s\n",buf);if(strcmp(buf,"quit") == 0){break;}}close(fd[0]);}else{perror("fork");return -1;}wait(NULL);return 0;
}

?效果圖:

2> 使用標準IO完成兩個文件的拷貝

#include<myhead.h>int main(int argc, const char *argv[])
{FILE* rfile;FILE* wfile;if((rfile = fopen("./01test.c","r")) == NULL){perror("fopen");return -1;}if((wfile = fopen("./02test.txt","w")) == NULL){perror("fopen");return -1;}char buf[128]="";int res = 0;while(1){res = fread(buf,1,sizeof(buf),rfile);if(res == 0 || res == -1){break;}fwrite(buf,res,1,wfile);}fclose(rfile);fclose(wfile);return 0;
}

?效果圖:

3> 使用文件IO實現兩個文件的拷貝

#include<myhead.h>int main(int argc, const char *argv[])
{pid_t rpid = -1;pid_t wpid = -1;if((rpid = open("./01test.c",O_RDONLY))==-1){perror("open");return -1;}if((wpid = open("./03test.txt",O_WRONLY | O_CREAT | O_TRUNC,0664))==-1){perror("open");return -1;}char buf[128]="";int res = 0;while(1){bzero(buf,sizeof(buf));res = read(rpid,buf,sizeof(buf));if(res == 0||res == -1){break;}write(wpid,buf,res);}close(rpid);close(wpid);return 0;
}

?效果圖:

4> 使用多進程完成兩個文件的拷貝

#include<myhead.h>int main(int argc, const char *argv[])
{pid_t pid = -1;int rfd = -1;int wfd = -1;if((rfd = open("./01test.c",O_RDONLY))==-1){perror("open");return -1;}if((wfd = open("./04test.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1){perror("open");return -1;}int len = lseek(rfd,0,SEEK_END);pid = fork();if(pid > 0){	lseek(rfd,0,SEEK_SET);lseek(wfd,0,SEEK_SET);char buf[128]="";int res = -1;int num = 0;while(1){	res = read(rfd,buf,sizeof(buf));num += res;if(num > len/2||res == 0){write(wfd,buf,res-(num-len/2));break;}write(wfd,buf,res);}close(rfd);close(wfd);wait(NULL);}else if(pid == 0){lseek(rfd,len/2,SEEK_SET);lseek(wfd,len/2,SEEK_SET);char buf[128]="";int res = -1;int num = 0;while(1){	res = read(rfd,buf,sizeof(buf));num += res;if(num > (len-len/2) || res == 0){write(wfd,buf,res-(num-len/2));break;}write(wfd,buf,res);}close(rfd);close(wfd);exit(EXIT_SUCCESS);}else{perror("fork");return -1;}return 0;
}

?效果圖:

5> 使用多線程完成兩個文件的拷貝

#include<myhead.h>
typedef struct
{const char* srcfile;const char* destfile;int place;int offset;
}arg;void* read_file(void* aarg)
{arg ofile=*((arg*)aarg);printf(" %s %s %d %d\n",ofile.srcfile,ofile.destfile,ofile.place,ofile.offset);int  rfd = -1;int  wfd = -1;if((rfd = open(ofile.srcfile,O_RDONLY))==-1){perror("open");pthread_exit(NULL);}if((wfd = open(ofile.destfile,O_WRONLY|O_CREAT,0664))==-1){perror("open");pthread_exit(NULL);}lseek(rfd,ofile.place,SEEK_SET);lseek(wfd,ofile.place,SEEK_SET);char buf[128]="";int res = 0;int num = 0;while(1){bzero(buf,sizeof(buf));res = read(rfd,buf,sizeof(buf));num += res;if(num >= ofile.offset||res == 0){write(wfd,buf,res-(num-ofile.offset));break;}write(wfd,buf,res);}		close(rfd);close(wfd);pthread_exit(NULL);}int main(int argc, const char *argv[])
{pthread_t rtid = -1;pthread_t wtid = -1;pid_t fd = -1;if((fd = open(argv[1],O_RDONLY))==-1){perror("open");return -1;}int len = lseek(fd,0,SEEK_END);close(fd);arg ofile_information={argv[1],argv[2],0,len/2};if((pthread_create(&rtid,NULL,read_file,&ofile_information)) != 0){perror("pthread_creat");return -1;}arg tfile_information={argv[1],argv[2],len/2,len-(len/2)};if((pthread_create(&wtid,NULL,read_file,&tfile_information)) != 0){perror("pthread_creat");return -1;}pthread_join(rtid,NULL);pthread_join(wtid,NULL);return 0;
}

?

效果圖:

6> 將互斥鎖的案例重新寫一遍

#include<myhead.h>pthread_mutex_t mutex;
int money = 5000;void* cost(void* arg)
{while(1){pthread_mutex_lock(&mutex);money -= 50; printf("小王花了50,還剩%d\n",money);pthread_mutex_unlock(&mutex);sleep(1);}pthread_exit(NULL);
}int main(int argc, const char *argv[])
{pthread_t tid;//初始化pthread_mutex_init(&mutex,NULL);if(pthread_create(&tid,NULL,cost,NULL) != 0){perror("pthread_create");return -1;}//上鎖while(1){sleep(1);pthread_mutex_lock(&mutex);money -= 100;printf("小張花了100,還剩:%d\n",money);pthread_mutex_unlock(&mutex);}pthread_mutex_destroy(&mutex);pthread_join(tid,NULL);return 0;
}

?效果圖:

7> 將無名信號量實現生產者消費者程序重新實現一遍

#include<myhead.h>sem_t sem;void* task1(void* arg)
{while(1){printf("我生產了\n");sem_post(&sem);sleep(1);}pthread_exit(NULL);
}void* task2(void* arg)
{while(1){sem_wait(&sem);printf("我消費了\n");//sem_post(&sem);sleep(1);}pthread_exit(NULL);
}int main(int argc, const char *argv[])
{pthread_t tid1;pthread_t tid2;//初始化sem_init(&sem,0,0);if(pthread_create(&tid1,NULL,task1,NULL) != 0){perror("pthread_create");return -1;}if(pthread_create(&tid2,NULL,task2,NULL) != 0){perror("pthread_create");return -1;}sem_destroy(&sem);pthread_join(tid1,NULL);pthread_join(tid2,NULL);return 0;
}

效果圖:

8> 將條件變量實現生產者消費者程序重新實現一遍

#include<myhead.h>pthread_cond_t cond;
pthread_mutex_t mutex;void* task1(void* arg)
{while(1){printf("生產了一個\n");pthread_cond_signal(&cond);sleep(1);}
}void* task2(void* arg)
{while(1){pthread_mutex_lock(&mutex);pthread_cond_wait(&cond,&mutex);printf("%#lx消費了一個\n",pthread_self());pthread_mutex_unlock(&mutex);sleep(1);}
}int main(int argc, const char *argv[])
{pthread_t tid1,tid2,tid3,tid4,tid5,tid6;//初始化pthread_cond_init(&cond,NULL);pthread_mutex_init(&mutex,NULL);//生產線if(pthread_create(&tid1,NULL,task1,NULL) != 0){perror("pthread_create");return -1;}//消費線if(pthread_create(&tid2,NULL,task2,NULL) != 0){perror("pthread_create");return -1;}if(pthread_create(&tid3,NULL,task2,NULL) != 0){perror("pthread_create");return -1;}if(pthread_create(&tid4,NULL,task2,NULL) != 0){perror("pthread_create");return -1;}if(pthread_create(&tid5,NULL,task2,NULL) != 0){perror("pthread_create");return -1;}if(pthread_create(&tid6,NULL,task2,NULL) != 0){perror("pthread_create");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_cond_destroy(&cond);pthread_mutex_destroy(&mutex);return 0;
}

效果圖:

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

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

相關文章

wordpress小記

1.插件市場搜索redis&#xff0c;并按照 Redis Object cache插件 2.開啟php的redis擴展 執行php -m|grep redis&#xff0c;沒有顯示就執行 yum -y install php-redis3.再次修改wp配置文件&#xff0c;增加redis的配置 define( WP_REDIS_HOST, 114.80.36.124 );define( WP_…

非標設計之電磁閥

電磁閥&#xff1a; 分類&#xff1a; 動畫演示兩位三通電磁閥&#xff1a; 兩位三通電磁閥動畫演示&#xff1a; 111&#xff1a; 氣缸回路的介紹&#xff1a; 失電狀態&#xff1a; 電磁閥得電狀態&#xff1a; 兩位五通電磁閥的回路&#xff1a;&#xff08;常用&#xf…

算數運算符和算數表達式

基本算數運算符 算數運算符&#xff1a; &#xff08;加法運算符或正值運算符&#xff09;、-&#xff08;減法運算符或負值運算符&#xff09;、*&#xff08;乘&#xff09;、/&#xff08;除&#xff09;、%&#xff08;求余數&#xff09; 雙目運算符&#xff1a; 雙目…

四則運算 .

輸入一個表達式&#xff08;用字符串表示&#xff09;&#xff0c;求這個表達式的值。 保證字符串中的有效字符包括[‘0’-‘9’],‘’,‘-’, ‘*’,‘/’ ,‘(’&#xff0c; ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表達式一定合法。字符串長度滿足1≤n≤1000 輸入描述&#x…

CGAL的2D符合規定的三角剖分和網格

1、符合規定的三角剖分 1.1、定義 如果三角形的任何面的外接圓在其內部不包含頂點&#xff0c;則該三角形是 Delaunay 三角形。 約束 Delaunay 三角形是一種盡可能接近 Delaunay 的約束三角形。 約束 Delaunay 三角形的任何面的外接圓在其內部不包含從該面可見的數據點。 如果…

陀螺儀LSM6DSV16X與AI集成(3)----讀取融合算法輸出的四元數

陀螺儀LSM6DSV16X與AI集成.2--姿態解算 概述視頻教學樣品申請完整代碼下載使用demo板生成STM32CUBEMX串口配置IIC配置CS和SA0設置串口重定向參考程序初始化SFLP步驟初始化SFLP讀取四元數數據演示 概述 LSM6DSV16X 特性涉及到的是一種低功耗的傳感器融合算法&#xff08;Sensor…

MySQL之創建時間類型的字段表

mysql之創建時間類型的字段表 CREATE TABLE tab(birthday DATE, -- 生日job_time DATETIME, -- 記錄年月日時分秒login_time TIMESTAMP -- 時間戳NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP )解釋&#xff1a; NOT NULL DEFAULT &#xff1a;默認不為空…

css未來:使用light-dark()切換主題色

css未來&#xff1a;使用light-dark()切換主題色 要根據使用的是淺色模式還是深色模式來更改顏色&#xff0c;我們通常會使用 prefers-color-scheme 媒體查詢。為了讓代碼實現變得更容易&#xff0c;CSS 現在附帶了一個名為 light-dark() 的實用函數。該函數接受兩個顏色值作為…

編譯原理lab3-cminus_compiler-LLVM簡要熟悉

lab3實驗報告&#xff0c;我的實驗報告圖例很少&#xff0c;這次只有兩張圖&#xff0c;其余的都以復制輸出的形式展現出來了&#xff0c;最終提交的代碼在最后 [[#你的提交|你的提交]][[#實驗設計|實驗設計]][[#提交一&#xff1a;手動編寫.ll|提交一&#xff1a;手動編寫.ll…

TREK610C高壓放大器

181/2461/8938技術規格 輸出電壓&#xff1a;0到10 kV直流電壓 輸出電流&#xff1a;0到2 mA 轉換率&#xff1a;大于500 V/μs 信號帶寬&#xff1a;直流到1.0 kHz &#xff08;-3dB&#xff09; 放大倍數&#xff1a;1000 V/V 閉環系統以保持低噪音、高精確度電壓輸出 短…

最簡單的基于 FFmpeg 的音頻解碼器

最簡單的基于 FFmpeg 的音頻解碼器 最簡單的基于 FFmpeg 的音頻解碼器正文參考工程文件下載 參考雷霄驊博士的文章&#xff0c;鏈接&#xff1a;最簡單的基于FFMPEGSDL的音頻播放器&#xff1a;拆分-解碼器和播放器 最簡單的基于 FFmpeg 的音頻解碼器 正文 FFmpeg 音頻解碼器…

【ArcGIS微課1000例】0080:ArcGIS將shp轉json(geojson)案例教程

本文以案例的形式,講述在ArcGIS軟件中,將矢量數據轉為GeoJSON的方法。 擴展閱讀:【GIS風暴】GeoJSON數據格式案例全解 文章目錄 一、GeoJson簡介二、ArcGIS將矢量數據轉為GeoJSON一、GeoJson簡介 GeoJSON是一種基于JSON的地理空間數據交換格式,它定義了幾種類型JSON對象以…

Spring Cloud Gateway 網關的基礎使用

1. 什么是網關&#xff1f;網關有什么用&#xff1f; 在微服務架構中&#xff0c;網關就是一個提供統一訪問地址的組件&#xff0c;它解決了內部微服務與外部的交互問題。網關主要負責流量的路由和轉發&#xff0c;將外部請求引到對應的微服務實例上。同時提供身份認證、授權、…

Spring-Boot---配置文件

文章目錄 配置文件的作用配置文件的格式PropertiesProperties基本語法讀取Properties配置文件 ymlyml基本語法讀取yml配置文件 Properties VS Yml 配置文件的作用 整個項目中所有重要的數據都是在配置文件中配置的&#xff0c;具有非常重要的作用。比如&#xff1a; 數據庫的…

230. 二叉搜索樹中第K小的元素 --力扣 --JAVA

題目 給定一個二叉搜索樹的根節點 root &#xff0c;和一個整數 k &#xff0c;請你設計一個算法查找其中第 k 個最小元素&#xff08;從 1 開始計數&#xff09;。 解題思路 利用List存儲數據&#xff1b;遍歷整個樹&#xff0c;讀取數各個節點的value&#xff1b;對value進行…

Python繪制多分類ROC曲線

目錄 1 數據集介紹 1.1 數據集簡介 1.2 數據預處理 2隨機森林分類 2.1 數據加載 2.2 參數尋優 2.3 模型訓練與評估 3 繪制十分類ROC曲線 第一步&#xff0c;計算每個分類的預測結果概率 第二步&#xff0c;畫圖數據準備 第三步&#xff0c;繪制十分類ROC曲線 1 數據集…

【數據結構】——排序篇(上)

前言&#xff1a;前面我們已經學過了許許多多的排序方法&#xff0c;如冒泡排序&#xff0c;選擇排序&#xff0c;堆排序等等&#xff0c;那么我們就來將排序的方法總結一下。 我們的排序方法包括以下幾種&#xff0c;而快速排序和歸并排序我們后面進行詳細的講解。 直接插入…

Qt實現二維碼生成和識別

一、簡介 QZxing開源庫: 生成和識別條碼和二維碼 下載地址&#xff1a;https://gitcode.com/mirrors/ftylitak/qzxing/tree/master 二、編譯與使用 1.下載并解壓&#xff0c;解壓之后如圖所示 2.編譯 打開src目錄下的QZXing.pro&#xff0c;選擇合適的編譯器進行編譯 最后生…

util.js

一、util.js是什么&#xff1f; 1、util.js是Node.js提供的一個工具庫&#xff0c;主要用于輔助實現JavaScript代碼的通用功能。 2、除了Node.js中內置的模塊外&#xff0c;util.js是Node.js中最核心的模塊之一。 3、通過util.js&#xff0c;開發者可以輕松實現JavaScript常…

Unity 資源管理之StreamingAssets

StreamingAssets也是Unity中特殊的文件夾&#xff0c;用于存放運行時可以直接訪問的資源。StreamingAssets一般存放數據或配置文件、圖片、視頻資源等。 StreamingAssets的文件路徑可以通過Application.streamingAssetsPath來獲取。 加載或訪問使用WWW類或UnityWebRequest類。…