IO / day06 作业

1.使用有名管道,完成两个进程的相互通信

代码:

//  使用有名管道,完成两个进程的相互通信#include <myhead.h>// task sender
void *tasks(void *arg)
{printf("I am tasks\n");int fdw = -1;const char **ppargv = (const char **)arg; // resolve param arg get file nameprintf("fifo_send=%s\n", *(ppargv + 1) );if( (fdw =open( *(ppargv +1), O_WRONLY)) == -1) {//printf("3------\n");perror("fdw open error");return NULL;}//printf("4------\n");char wbuf[128] = ""; // buffer for writewhile(1){printf("please input msg:\n");fgets(wbuf, sizeof(wbuf), stdin);wbuf[strlen(wbuf) -1] = 0;write(fdw, wbuf, sizeof(wbuf));if(strcmp(wbuf, "quit")==0){break;}}close(fdw);printf("com closed!\n");pthread_exit( NULL);
}void *taskr(void *arg)
{printf("I am taskr\n");int fdr = -1;const char **ppargv =(const char **)arg;printf("fifo_recv=%s\n", *(ppargv + 2)) ;if( (fdr = open( *(ppargv + 2)  , O_RDONLY)) == -1) {//printf("1------\n");perror("fdr open error");return NULL;}char rbuf[128] = "";//printf("2------\n");while(1){//printf("a------\n");bzero(rbuf, sizeof(rbuf));int res = read(fdr, rbuf, sizeof(rbuf));printf("received msg: %s\n", rbuf);if(strcmp(rbuf, "quit")==0){break;}}close(fdr);pthread_exit( NULL);}int main(int argc, const char *argv[])
{if(argc<3){printf("input param error\n");printf("usage: ./a.out fifo(send) fifo(recv)\n");return -1;}//char **ppargv = argv;//argv 是指针数组void *ppargv = (void *)argv;pthread_t tidr = -1;pthread_t tids = -1;if((pthread_create(&tidr, NULL, taskr,(void *) ppargv))==-1  ){printf("thread create error!\n");return -1;}if((pthread_create(&tids, NULL, tasks,(void *) ppargv))==-1  ){printf("thread create error!\n");return -1;}pthread_join(tidr, NULL);pthread_join(tids, NULL);return 0;
}

运行结果

2.使用无名管道完成父子进程间的通信

代码:

#include <myhead.h>
//使用无名管道完成父子进程间的通信int main(int argc, const char *argv[])
{//define pid varpid_t pidr = -1;//define fd of pipe file arrayint pipefd[2] = {0};//create pipe file, ***please note this shall be done before fork().if(pipe(pipefd) == -1 ){perror("create pipe file error");return -1;}printf("pipefd[0]=%d, pipefd[1]=%d\n", pipefd[0], pipefd[1] ); //pipdfd[0]--> read; pipefd[1]-->write//create sub processpidr = fork(); // pipefd will be copied to subprocess after fork();if (pidr>0) // means main process{printf(">I am main process\n");// main process play as msg senderclose(pipefd[0]);//define a write bufferchar wbuf[128] = "";while(1){printf("\t\t\t\t\tplease input a msg to send: \n");fgets(wbuf, sizeof(wbuf), stdin); // get inputs from terminalwbuf[strlen(wbuf) - 1] = 0; //remove retrun characterwrite(pipefd[1], wbuf, sizeof(wbuf) ); // write to pipe fileprintf("\t\t\t\t\tmsg has been sent!\n");if(strcmp(wbuf, "quit")==0){break;}}close(pipefd[1]);}else if(pidr == 0) // means subprocess{printf(">I am sub process\n");//sub process play as read, close write portclose(pipefd[1]);//define a read bufferchar rbuf[128] = "";sleep(3);while(1){bzero(rbuf, sizeof(rbuf));	read(pipefd[0], rbuf, sizeof(rbuf));printf("recv msg:%s\n", rbuf);if(strcmp(rbuf, "quit")==0){break;}}// close read fd of  pipe file close(pipefd[0]);//exit sub processexit(EXIT_SUCCESS);}else{perror("fork error");return -1;}return 0;
}

运行结果


3.使用标准IO完成两个文件的拷贝

代码:

#include <myhead.h>// 使用标准IO完成两个文件的拷贝void cpy(const char *src, const char *dst)
{//define FILE ptrFILE *fdsrc = NULL;FILE *fddst = NULL;if( (fdsrc=fopen(src, "r")) == NULL  ) // open src file as read only{perror("src fopen error");return ;}if( (fddst=fopen(dst, "w")) == NULL  ) // open dst file as wirte only{perror("dst fopen error");return ;}while(!feof(fdsrc)) // copy until reach eof{char buf[128] = {0};int res =	fread(buf,  sizeof(char), sizeof(buf), fdsrc);fwrite(buf, sizeof(char), res, fddst); // *** shall only write what read, not buffer}fclose(fdsrc);fclose(fddst);}int main(int argc, const char *argv[])
{if(argc!=3){printf("input error");printf("usage: ./aout srcfile, dstfile\n");return -1;}cpy(argv[1], argv[2]);return 0;
}

运行结果


4.使用文件IO实现两个文件的拷贝

代码:

#include <myhead.h>void cpy(const char *src, const char *dst)
{//define fdint fdr = -1;int fdw = -1;//open fileif( (fdr=open(src, O_RDONLY)) == -1) {perror("open error");return ;}if( (fdw=open(dst, O_WRONLY | O_CREAT | O_TRUNC, 0664)) == -1 ){perror("open error");return ;}//file sizeint len = lseek(fdr, 0, SEEK_END);//define a bufferchar buf[8] = "";lseek(fdr, 0, SEEK_SET);while(len > 0){int res = read(fdr, buf, sizeof(buf));write(fdw, buf, res);len -= sizeof(buf);//printf("buf=%s, len=%d, res=%d\n", buf, len, res);}close(fdr);close(fdw);}int main(int argc, const char *argv[])
{if(argc!=3){printf("input error\n");printf("usage: ./a.out srcfile, dstfile\n");}cpy(argv[1], argv[2]);return 0;
}

运行结果


5.使用多进程完成两个文件的拷贝

代码:

#include <myhead.h>// 使用多进程完成两个文件的拷贝// get file size
int len(const char *src)
{int fds = -1;if( (fds=open(src, O_RDONLY))==-1   ){perror("open error");return -1;}int len = lseek(fds, 0, SEEK_END); // move cursor to the file endif(len==-1){return -1;}close(fds);return len;
}//copy func
int cpy(const char *src, const char *dst, int start, int size)
{int fdr = -1;int fdw = -1;if( (fdr=open(src, O_RDONLY)) == -1 ){perror("open error");return -1;}if( (fdw=open(dst, O_WRONLY )) == -1 ){perror("open error");return -1;}//bufferchar buf[128] = "";// there are 2 processes working for copy job, // move cursor to self startlseek(fdr, start, SEEK_SET); lseek(fdw, start, SEEK_SET);while(size > 0 ){int res = read(fdr, buf , sizeof(buf));//printf("size=%d, start=%d, res=%d, buf=%s\n", size, start, res, buf);write(fdw, buf, res);size -= sizeof(size);}close(fdr);close(fdw);}int main(int argc, const char *argv[])
{if(argc!=3){printf("input error\n");printf("usage: ./a.out srcfile, dstfile\n");return -1;}// get file names from paramsconst char *src = argv[1];const char *dst = argv[2];int fsize = len(src);//create dst file for following cpy job in 2 processint fdw = -1;if( (fdw=open(dst, O_WRONLY | O_CREAT | O_TRUNC, 0664)) == -1 ){perror("open error");return -1;}close(fdw);//define pid pid_t pidr = -1;//create a sub processpidr = fork();if(pidr > 0){//parent processcpy(src, dst, 0, fsize/2);}else if(pidr == 0){//sub processcpy(src, dst, fsize/2 , fsize - (fsize/2));//exit with flush bufferexit(EXIT_SUCCESS);	// exit without flush buffer //_exit(EXIT_SUCCESS);		}else{perror("fork error");return -1;}wait(NULL); // recycle process resourcesreturn 0;
}

运行结果:


6.使用多线程完成两个文件的拷贝

代码:


//  使用多线程完成两个文件的拷贝#include <myhead.h>typedef struct Param
{const char *src;const char *dst;int start;int size;} param_t, *ptr_param_t;int get_file_size(const char *src)
{int fdr = -1;if( (fdr=open(src, O_RDONLY)) == -1   ){perror("open error");return -1;}int fsize = lseek(fdr, 0, SEEK_END);return fsize;
}int cpy(const char *src, const char *dst, int start, int size)
{//printf("1---\n");int fdr = -1;int fdw = -1;if( (fdr=open(src, O_RDONLY)) == -1   ){perror("open error");return -1;}if( (fdw=open(dst, O_WRONLY)) == -1   ){perror("open error");return -1;}int len = get_file_size(src);char buf[128] = "";lseek(fdr, start, SEEK_SET);lseek(fdw, start, SEEK_SET);while(len > 0){//printf("2---\n");int res = read(fdr, buf, sizeof(buf) );//printf("start=%d, len=%d, buf=%s\n", start, len, buf);write(fdw, buf, res);len -= sizeof(buf);	}pthread_exit(NULL);return 0;}void *task_copy(void *arg)
{//resolve paramsptr_param_t ptrparam = (ptr_param_t)arg; // convert void * to struct Param *//printf("src=%s, dst=%s, start=%d, size=%d\n", ptrparam->src, ptrparam->dst, ptrparam->start, ptrparam->size );cpy(ptrparam->src, ptrparam->dst, ptrparam->start, ptrparam->size );}int main(int argc, const char *argv[])
{if(argc != 3){perror("input error\n");return -1;}const char *src = argv[1];const char *dst = argv[2];int fsize =get_file_size(src);printf("fsize=%d\n", fsize);//create dst fileint fdw = -1;if( (fdw=open(dst, O_WRONLY | O_CREAT | O_TRUNC, 0664)) == -1   ){perror("open error");return -1;}param_t param1 = {src, dst, 0, fsize/2};param_t param2 = {src, dst, fsize/2 , fsize - (fsize/2)};ptr_param_t pparam1 = &param1;ptr_param_t pparam2 = &param2;pthread_t tid = -1;//create a threadif(  (tid = pthread_create(&tid, NULL, task_copy, (void *)pparam1 ) ) != 0  ){return -1;}task_copy((void *)pparam2 );pthread_join(tid, NULL);return 0;
}

运行结果运行结果


7.将互斥锁的案例

代码:

// 互斥锁的案例#include <myhead.h>// public resourcesint money = 5000;//1.define mutexpthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;void *task(void *task)
{while(1){// 3.lock  critical resource pthread_mutex_lock(&mutex);money -= 50;printf("lisi withdraw 50yuan, money=%d\n", money);// 4.unlock critical resourcepthread_mutex_unlock(&mutex);sleep(1);}pthread_exit(NULL);}int main(int argc, const char *argv[])
{pthread_t tid = -1;// 2.init mutexpthread_mutex_init(&mutex, NULL);if( (tid=pthread_create(&tid, NULL, task, NULL))==-1   ){perror("pthread_create error");return -1;}while(1){// 3.lock  critical resource pthread_mutex_lock(&mutex);money -= 100;printf("zhangsan withdraw 100yuan. money=%d\n", money);// 4.unlock critical resourcepthread_mutex_unlock(&mutex);sleep(1);}pthread_join(tid, NULL);// 5. destroy mutexpthread_mutex_destroy(&mutex);return 0;
}

运行结果


8.无名信号量实现生产者消费者程序

代码:

//   无名信号量实现生产者消费者程序#include <myhead.h>// 1. define a sem
sem_t sem; void *task_c(void *arg)
{while(1){sleep(1);// wait for available value,  >0: value dec and continue, =0: waiting sem_wait(&sem);printf("I consumed a car\n");}pthread_exit(NULL);}void *task_p(void *arg)
{while(1){sleep(2);printf("I produced a car\n");// after production, sem value inc sem_post(&sem);}pthread_exit(NULL);}int main(int argc, const char *argv[])
{pthread_t tid_c = -1;pthread_t tid_p = -1;// 2. init semsem_init(&sem , 0, 0);//param 2 value 0 means thread; non 0 means process(has to be in relative processes)//param 3 value 0 means valueif( pthread_create(&tid_c, NULL, task_c, NULL) != 0   ){printf("thread create error!\n");return -1;}if( pthread_create(&tid_p, NULL, task_p, NULL) != 0   ){printf("thread create error!\n");return -1;}pthread_join(tid_c, NULL);pthread_join(tid_p, NULL);// 5. destroy semsem_destroy(&sem);return 0;
}

运行结果


9.条件变量实现生产者消费者程序

代码:

// 将条件变量实现生产者消费者程序#include <myhead.h>// 1.1 define a cond varpthread_cond_t cond;// 1.2 define a mutex
pthread_mutex_t mutex; void *task_c(void *arg)
{int n = 2;while(n--){// 3.1 lock critical resource --> cond FIFOpthread_mutex_lock(&mutex);//3.2  critiacl code waiting in cond quere//inside cond, will unlock mutex -> put this into queue -> lock againpthread_cond_wait(&cond, &mutex);//3.3 unlock pthread_mutex_unlock(&mutex);printf("I consumed a car\n");sleep(1);}pthread_exit(NULL);}void *task_p(void *arg)
{int n = 10;while(n--){printf("I produced a car\n");// 4. after production, release a signal to consumerpthread_cond_signal(&cond);sleep(1);}printf("production closed!\n");pthread_exit(NULL);}#include <myhead.h>int main(int argc, const char *argv[])
{int n=2;pthread_t tid_p = -1;pthread_t tid_arr[n];for(int i=0; i<5; i++){tid_arr[i] = -1;}// 2.1init condpthread_cond_init(&cond, NULL);// 2.2 init mutex pthread_mutex_init(&mutex, NULL);if(pthread_create(&tid_p, NULL, task_p, NULL ) !=0 ){printf("thread p create error\n");return -1;}for (int i=0; i<5; i++){if(pthread_create(&tid_arr[i], NULL, task_c, NULL ) !=0 ){printf("thread [%d] create error\n", i);return -1;}}for(int i=0; i<5; i++){pthread_join(tid_arr[i] , NULL );}// 5.1pthread_cond_destroy(&cond); //5.2pthread_mutex_destroy(&mutex);return 0;
}

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/263314.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DOS 批处理 (一)

DOS 批处理 1. 批处理是什么&#xff1f;2. DOS和MS-DOS3. 各种操作系统shell的区别Shell 介绍图形用户界面&#xff08;GUI&#xff09;shell命令行界面&#xff08;CLI&#xff09;的 shell命令区别 1. 批处理是什么&#xff1f; 批处理(Batch)&#xff0c;也称为批处理脚本…

App 设计工具中的启动任务和输入参数

目录 创建 startupFcn 回调 定义输入 App 参数 可以使用 App 设计工具创建一个特殊函数&#xff0c;该函数在 App 启动时、但在用户与 UI 进行交互之前执行。此函数称为 startupFcn 回调&#xff0c;它非常适用于设置默认值、初始化变量或执行影响 App 初始状态的命令。例如&…

Weblogic-wls-wsat-unserialize_CVE-2017-10271

文章目录 Weblogic < 10.3.6 wls-wsat XMLDecoder 反序列化漏洞1. 漏洞描述2. 漏洞复现2.1 环境启动2.2 漏洞扫描2.3 漏洞验证 3. 修复建议 Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞 1. 漏洞描述 说明内容漏洞编号CVE-2017-10271漏洞名称Weblogic <…

windows系统安装RocketMQ_dashboard

1.下载源码 按照官网说明下载源码 官网 官网文档 2.源码安装 2.1.① 编译rocketmq-dashboard 注释掉报错的maven插件frontend-maven-plugin、maven-antrun-plugin mvn clean package -Dmaven.test.skiptrue2.2.② 运行rocketmq-dashboard java -jar target/rocketmq-…

【HarmonyOS开发】拖拽动画的实现

动画的原理是在一个时间段内&#xff0c;多次改变UI外观&#xff0c;由于人眼会产生视觉暂留&#xff0c;所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧&#xff0c;对应一次屏幕刷新&#xff0c;而决定动画流畅度的一个重要指标就是帧率FPS&#xff08;F…

FreeRTOS的任务优先级、Tick以及状态讲解(尊敬的嵌入式工程师,不妨进来喝杯茶)

任务优先级和Tick 在FreeRTOS中&#xff0c;任务的优先级和Tick是两个关键的概念&#xff0c;它们直接影响任务的调度和执行。 任务优先级 每个任务都被分配一个优先级&#xff0c;用于决定任务在系统中的调度顺序。 优先级是一个无符号整数&#xff0c;通常从0开始&#xff0…

【HarmonyOS开发】详解常见容器的使用

声明式UI提供了以下8种常见布局&#xff0c;开发者可根据实际应用场景选择合适的布局进行页面开发。 布局 应用场景 线性布局&#xff08;Row、Column&#xff09; 如果布局内子元素超过1个&#xff0c;且能够以某种方式线性排列时优先考虑此布局。 层叠布局&#xff08;St…

Faster R-CNN

Faster R-CNN是作者Ross Girshick继Fast R-CNN后的又一力作。同样使用VGG16作推理速度在GPU上达到5fps(包括候选区域的生成)&#xff0c;准确率为网络的backbone&#xff0c;也有进一步的提升。在2015年的ILSVRC以及COCO竞赛中获得多个项目的第一名。 算法流程 右边这部分和Fa…

排序算法---选择排序

1.实现流程&#xff1a; 1. 把第一个没有排序过的元素设置为最小值&#xff1b; 2. 遍历每个没有排序过的元素&#xff1b; 3. 如果元素 < 现在的最小值&#xff1b; 4. 将此元素设置成为新的最小值&#xff1b; 5. 将最小值和第一个没有排序过的位置交换 选择排序执行流程…

laravel的ORM 对象关系映射

Laravel 中的 ORM&#xff08;Eloquent ORM&#xff09;是 Laravel 框架内置的一种对象关系映射系统&#xff0c;用于在 PHP 应用中与数据库进行交互。Eloquent 提供了一种优雅而直观的语法&#xff0c;使得开发者可以使用面向对象的方式进行数据库查询和操作。 定义模型&…

C++笔记之C语言中的换行符和转义符

C笔记之C语言中的换行符和转义符 文章目录 C笔记之C语言中的换行符和转义符 在C语言中&#xff0c;换行符和转义符用于在字符串和字符常量中表示特殊字符。下面是关于换行符和转义符的解释&#xff1a; 换行符&#xff08;Newline character&#xff09;&#xff1a; 在C语言中…

【漏洞复现】华脉智联指挥调度平台/script_edit/fileread.php文件读取漏洞

Nx01 产品简介 深圳市华脉智联科技有限公司&#xff0c;融合通信系统将公网集群系统、专网宽带集群系统、不同制式、不同频段的短波/超短波对讲、模拟/数字集群系统、办公电话系统、广播系统、集群单兵视频、视频监控系统、视频会议系统等融为一体&#xff0c;集成了专业的有线…