【嵌入式学习】IO进程线程day02.22

一、思维导图

二、习题

1> 将互斥机制的代码实现

#include <myhead.h>//定义一个全局变量
char str[128]="我是一个全局字符串数组";
//1、创建一个互斥锁变量
pthread_mutex_t mutex;//线程1
void *pth1(void *arg)
{//上锁pthread_mutex_lock(&mutex);//对全局变量进行操作strcat(str,",我现在在线程1");//输出printf("我是线程1输出:%s\n",str);//解锁pthread_mutex_unlock(&mutex);
}//线程2
void *pth2(void *arg)
{//上锁pthread_mutex_lock(&mutex);//对全局变量进行操作strcpy(str,",我现在在线程2");printf("我是线程2输出:%s\n",str);//解锁pthread_mutex_unlock(&mutex);
}int main(int argc, const char *argv[])
{//2、初始化所资源pthread_mutex_init(&mutex,NULL);//定义线程号pthread_t tid1=-1;pthread_t tid2=-1;//创建分支线程1 if(pthread_create(&tid1,NULL,pth1,NULL)!=0){printf("ERROR");return -1;}//创建分支线程2if(pthread_create(&tid2,NULL,pth2,NULL)!=0){printf("ERROR");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);printf("程序结束\n");//销毁互斥锁pthread_mutex_destroy(&mutex);return 0;
}

 

2> 将无名信号量的代码实现

#include <myhead.h>//定义无名信号量
sem_t sem;//线程1
void *pth1(void *arg)
{int n=5;while(n--){sleep(1);//输出printf("我是特斯拉顶级销售,谁要买车!!!\n");sem_post(&sem);}pthread_exit(NULL);
}//线程2
void *pth2(void *arg)
{int n=5;while(n--){sem_wait(&sem);printf("我要买车\n");}pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//初始化无名信号量sem_init(&sem,0,0);//定义线程号pthread_t tid1=-1;pthread_t tid2=-1;//创建分支线程1 if(pthread_create(&tid1,NULL,pth1,NULL)!=0){printf("ERROR");return -1;}//创建分支线程2if(pthread_create(&tid2,NULL,pth2,NULL)!=0){printf("ERROR");return -1;}pthread_join(tid1,NULL);pthread_join(tid2,NULL);printf("程序结束\n");//销毁无名信号量sem_destroy(&sem);return 0;
}
ubuntu@ubu

 

3> 将条件变量的代码实现

#include <myhead.h>//1、定义
pthread_cond_t cond;//1、定义互斥锁
pthread_mutex_t mutex;//线程1
void *pth1(void *arg)
{int num=5;while(num--){sleep(1);printf("%#lx:我是特斯拉顶级销售\n",pthread_self());//3、唤醒一个消费者pthread_cond_signal(&cond);}pthread_exit(NULL);
}//线程2
void *pth2(void *arg)
{//3、上锁pthread_mutex_lock(&mutex);//4、等待条件变量pthread_cond_wait(&cond,&mutex);printf("我是%#lx:我要来买车\n",pthread_self());//4、解锁pthread_mutex_unlock(&mutex);pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//2、初始化条件变量pthread_cond_init(&cond,NULL);//2、初始化互斥锁pthread_mutex_init(&mutex,NULL);//定义线程号pthread_t tid1,tid2,tid3,tid4,tid5,tid6;//创建分支线程1 if(pthread_create(&tid1,NULL,pth1,NULL)!=0){printf("ERROR");return -1;}//创建分支线程2if(pthread_create(&tid2,NULL,pth2,NULL)!=0){printf("ERROR");return -1;}//创建分支线程3if(pthread_create(&tid3,NULL,pth2,NULL)!=0){printf("ERROR");return -1;}//创建分支线程4if(pthread_create(&tid4,NULL,pth2,NULL)!=0){printf("ERROR");return -1;}//创建分支线程5if(pthread_create(&tid5,NULL,pth2,NULL)!=0){printf("ERROR");return -1;}//创建分支线程6if(pthread_create(&tid6,NULL,pth2,NULL)!=0){printf("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);printf("程序结束\n");//释放互斥锁pthread_mutex_destroy(&mutex);//释放条件变量pthread_cond_destroy(&cond);return 0;
}

 

4> 将无名管道的代码实现

#include <myhead.h>
int main(int argc, const char *argv[])
{//创建管道文件int pipefd[2]={0};if(pipe(pipefd)==-1){perror("pipe error");return -1;}printf("pipefd[0]=%d,pipefd[1]=%d\n",pipefd[0],pipefd[1]);//创建子进程pid_t pid=fork();if(pid>0){close(pipefd[0]);char wbuf[128]="";while(1){bzero(wbuf,sizeof(wbuf));fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;write(pipefd[1],wbuf,strlen(wbuf));if(strcmp(wbuf,"quit")==0){break;}}close(pipefd[1]);wait(NULL);}else if(pid==0){close(pipefd[1]);char rbuf[128]="";while(1){bzero(rbuf,sizeof(rbuf));read(pipefd[0],rbuf,sizeof(rbuf));printf("传来的数据:%s\n",rbuf);if(strcmp(rbuf,"quit")==0){break;}close(pipefd[0]);exit(EXIT_SUCCESS);}}else{perror("error");return -1;}return 0;
}

 

5> 将有名管道的代码实现

#include <myhead.h>
int main(int argc, const char *argv[])
{if((mkfifo("./MYFIFO",0664))==-1){perror("error");return -1;}//阻塞getchar();system("rm MYFIFO");return 0; 
}
#include <myhead.h>
int main(int argc, const char *argv[])
{int wfd=-1;if((wfd=open("./MYFIFO",O_WRONLY))==-1){perror("error");return -1;}char str[128]="";while(1){fgets(str,sizeof(str),stdin);str[strlen(str)-1]=0;write(wfd,str,strlen(str));if(strcmp(str,"quit")==0){break;}}close(wfd);return 0;
}
#include <myhead.h>
int main(int argc, const char *argv[])
{int rfd=-1;if((rfd=open("./MYFIFO",O_RDONLY))==-1){perror("error");return -1;}char str[128]="";while(1){bzero(str,sizeof(str));read(rfd,str,sizeof(str));printf("接受的数据:%s\n",str);if(strcmp(str,"quit")==0){break;}}close(rfd);return 0;
}

6> 使用有名管道完成两个进程的相互通信(提示:可以使用多进程或多线程完成)

#include <myhead.h>//线程1:实现写功能
void *task1(void *arg)
{int wfd=-1;if((wfd=open("./MYFIFO2",O_WRONLY))==-1){perror("error");}char str[128]="";while(1){fgets(str,sizeof(str),stdin);str[strlen(str)-1]=0;write(wfd,str,strlen(str));if(strcmp(str,"quit")==0){break;}}close(wfd);pthread_exit(NULL);
}//线程2:实现读功能
void *task2(void *arg)
{int rfd=-1;if((rfd=open("./MYFIFO1",O_RDONLY))==-1){perror("error");}char str[128]="";while(1){bzero(str,sizeof(str));read(rfd,str,sizeof(str));printf("从康康接受的数据:%s\n",str); if(strcmp(str,"quit")==0){break;}}close(rfd);pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{//创建分线程pthread_t pid1=-1;pthread_t pid2=-1;//设置无名if(pthread_create(&pid1,NULL,task1,0)!=0){printf("ERROR");return -1;}if(pthread_create(&pid2,NULL,task2,0)!=0){printf("ERROR");return -1;}pthread_join(pid1,NULL);pthread_join(pid2,NULL);return 0;
}
#include <myhead.h>//线程1:实现写功能
void *task1(void *arg)
{int wfd=-1;if((wfd=open("./MYFIFO1",O_WRONLY))==-1){perror("error");}char str[128]="";while(1){fgets(str,sizeof(str),stdin);str[strlen(str)-1]=0;write(wfd,str,strlen(str));if(strcmp(str,"quit")==0){break;}}close(wfd);pthread_exit(NULL);}//线程2:实现读功能
void *task2(void *arg)
{int rfd=-1;if((rfd=open("./MYFIFO2",O_RDONLY))==-1){perror("error");}char str[128]="";while(1){bzero(str,sizeof(str));read(rfd,str,sizeof(str));printf("从小康接受的数据:%s\n",str); if(strcmp(str,"quit")==0){break;}}close(rfd);pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{//创建分线程pthread_t pid1=-1;pthread_t pid2=-1;if(pthread_create(&pid1,NULL,task1,0)!=0){printf("ERROR");return -1;}if(pthread_create(&pid2,NULL,task2,0)!=0){printf("ERROR");return -1;}pthread_join(pid1,NULL);pthread_join(pid2,NULL);return 0;
}
#include <myhead.h>
int main(int argc, const char *argv[])
{if((mkfifo("./MYFIFO1",0664))==-1){perror("error");return -1;}//阻塞getchar();system("rm MYFIFO1");return 0; 
}
#include <myhead.h>
int main(int argc, const char *argv[])
{if((mkfifo("./MYFIFO2",0664))==-1){perror("error");return -1;}//阻塞getchar();system("rm MYFIFO2");return 0; 
}

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

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

相关文章

为新固态硬盘安装操作系统

目录 背景方案具体步骤1 为新硬盘进行分区2 下载Dism3 下载win10的iso文件4 通过Dism 重装系统5 从biso调整启动顺序5 遗留问题 参考资料 背景 情况是这样的&#xff0c;我的电脑本来就有一块sata的固态硬盘&#xff0c;作为c盘&#xff0c;装载的是win10系统。 一方面只有500…

matlab代码--基于matlabLDPC-和积译码系统

LDPC编码 一个码长为n、信息位个数为k的线性分组码&#xff08;n,k&#xff09;可以由一个生成矩阵 来定义&#xff0c;信息序列 通过G被映射到码字XS.G。线性分组码也可以由一个校验矩阵 来描述。所以码字均满足 。校验矩阵的每一行表示一个校验约束 &#xff0c;其中所有的非…

springboot大学生体质测试管理系统源码和论文

大学生体质测试管理系统提供给用户一个简单方便体质测试管理信息&#xff0c;通过留言区互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、教师和用户三个部分&#xff0c;系统管理员主要功能包括首…

(全注解开发)学习Spring-MVC的第三天

全注解开发 第一部分 : 1.1 消除spring-mvc.xml 这些是原来spring-mvc.xml配置文件的内容 <!--1、组件扫描, 使Controller可以被扫描到--><context:component-scan base-package"com.itheima.controller"/><!--2、非自定义的Bean, 文件上传解析器--&…

尝试一下最新的联合办公利器ONLYOffice

下载下来一起试试吧 桌面安装版下载地址&#xff1a;https://www.onlyoffice.com/zh/download-desktop.aspx) 官网地址&#xff1a;https://www.onlyoffice.com 普通Office对联合办公的局限性 普通Office软件&#xff08;如Microsoft Office、Google Docs等&#xff09;在面对…

程序员可以做哪些副业?

如果你经常玩知乎、看公众号&#xff08;软件、工具、互联网这几类的&#xff09;你就会发现&#xff0c;好多资源连接都变成了夸克网盘、迅雷网盘的资源链接。 例如&#xff1a;天涯神贴&#xff0c;基本上全是夸克、UC、迅雷网盘的资源链接。 有资源的前提下&#xff0c;迅雷…

adb-连接模拟器和真机操作

目录 1. 连接模拟器&#xff08;夜神模拟器示例&#xff09; 1.1 启动并连接模拟器 1.2 开启调试模式 2. USB连接真机调试 2.1 usb数据线连接好电脑&#xff0c;手机打开调试模式 2.2 输入adb devices检测手机 3. Wifi连接真机调试 3.1 USB连接手机和电脑 3.2 运行 adb…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第八天-高级驱动framebuffer(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1cd7LOSAvmPgVRPAyuMX7Fg?pwd1688 提取码&#xff1a;1688 帧缓冲&#xff08;framebuffer&#xff09;设备应用于linux显示技术方面。因为linux的显示平台已经全部基于framebuffer&#xff0c;所以目前在linux环境下开发图形化界面、…

MongoDB的介绍和使用

目录 一、MongoDB介绍 二、MongoDB相关概念 三、MongoDB的下载和安装 四、SpringBoot 整合 MongoDB 一、MongoDB介绍 MongoDB是一种NoSQL数据库管理系统&#xff0c;采用面向文档的数据库模型。它以C语言编写&#xff0c;旨在满足大规模数据存储和高性能读写操作的需求。Mo…

【C语言】注释

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

【Spring】SpringBoot 创建和使用

目 录 一.什么是Spring Boot&#xff1f;为什么要学Spring Boot&#xff1f;二.Spring Boot 优点三.Spring Boot 项目创建3.1 使用 Idea 创建3.2 网页版创建注意事项&#xff1a;包路径错误小结&#xff1a;约定大于配置 一.什么是Spring Boot&#xff1f;为什么要学Spring Boo…

WordPress后台自定义登录和管理页面插件Admin Customizer

WordPress默认的后台登录页面和管理员&#xff0c;很多站长都想去掉或修改一些自己不喜欢的功能&#xff0c;比如登录页和管理页的主题样式、后台左侧菜单栏的某些菜单、仪表盘的一些功能、后台页眉页脚某些小细节等等。这里boke112百科推荐这款可以让我们轻松自定义后台登录页…