当前位置: 首页 > article >正文

作业:IO:day??

第一题

思维导图

第二题

题目

创建2子个进程

        父进程负责:向文件中写入数据

        2个子进程负责:从文件中读取数据

要求:一定保证1号子进程先读取,2号子进程后读取 使用文件IO去实现

思路

①主进程向文本写入数据

②子进程根据自己是第 i 个被创建的,而延迟 i 秒后,执行逻辑;以达到先后顺序读取

代码

int main(int argc, const char *argv[])
{
    int len=2;                          //进程个数
    char buf[14]="hello world\n";       //用于向文本 写入数据 的字符数组
    char buf2[14]="";                   //用于从文本 读取数据 的字符数组
	int num=-1;							//记录是第几个子进程,后续值仍为-1就说明是父进程
    //创建进程
    for(int i=0;i<len;i++)
    {
        int res=fork();
        if(0==res)
		{
			num=i;
			break;
		}
    }
    if(num==-1)                                              //父进程: 创建文件并写入数据
    {
        int wfp=open("test.txt",O_WRONLY|O_CREAT,0666);      //打开文件
        write(wfp,buf,sizeof(buf));                          //读取文件数据
        close(wfp);                                          //关闭文件
        wait(0);
        wait(0);
        while (len--)
        {
            wait(0);    //回收子线程
        }
        
    }
    else                                       //子进程: 文件读取数据并输出显示
    {
	    sleep(num);                            //根据自己是第N个进程,延迟N秒
	    printf("第%d号子进程 ",num+1);
        int rfp=open("test.txt",O_RDONLY);     //打开文件
        read(rfp,buf2,sizeof(buf2));           //读取文件数据
        close(rfp);                            //关闭文件
        printf("%s",buf2);                     //输出显示
    }
	return 0;
}

结果

len=2时

len=5时

第三题

题目

创建一个线程(1个主线程和一个分支线程)

        主线程负责:输入三角形的三条边长

        分支线程负责:计算三角形的面积(自己百度海伦公式)

提示:使用sqrt函数编译的时候需要在编译的最后加上 -lm

思路

①使用一个【标志位】控制线程 动作顺序

② "标志位" 被置N时,将仅允许特定线程工作,直到该线程动作结束,并将 ”标志位“复原(或置为另一个数,指定下一个线程,以便控制动作顺序)

代码

int flag=0;     //用于控制进程顺序
double a,b,c;   //三角形边长
double res;     //三角形面积
//分支线程 函数功能
void* thread_main(void *arg)
{
    while(1)
    {
        if(flag==1)
        {
            printf("TIPS:当前为分支线程逻辑\n");
            //判断输入是否能构成三角形
            if(a+b>c && a+c>b && b+c>a)
            {
                double p=(a+b+c)/2;
                printf("p=%.2lf\n",p);
                res=sqrt(p*(p-a)*(p-b)*(p-c));
                printf("res=%.2lf\n",res);
            }
            else
            {
                printf("ERROR:所输入边长无法构成三角形\n");
            }
            printf("\n");
            //逻辑完毕,允许其他进程动作
            flag=0;
        }
    }
}

int main(int argc, const char *argv[])
{  
    pthread_t id;
    //线程id 线程属性 线程函数 线程参数
    pthread_create(&id,0,thread_main,0);
    
    while(1)
    {
        //满足条件,执行逻辑
        if(flag==0)
        {
            printf("TIPS:当前为主线程逻辑\n");
            printf("请输入三角形边长(double类型):");
            scanf("%lf %lf %lf",&a,&b,&c);
            printf("\n");
            //语句完毕,允许其他进程 发生动作
            flag=1;
        }

    }
	return 0;
}

结果


http://www.kler.cn/a/501798.html

相关文章:

  • 面向对象分析与设计Python版 分析与设计概述
  • 微服务的配置共享
  • 漏洞扫描工具
  • GRE技术的详细解释
  • 腾讯云AI代码助手编程挑战赛——贪吃蛇小游戏
  • uni-app (接入智谱清言语言模型)
  • docker的数据卷和自定义镜像
  • Python 二次元初音未来桌宠
  • 什么是数据仓库?
  • Perl语言的循环实现
  • 深入了解 Redis Stream 数据类型及其在事件流系统中的应用
  • 【Android】直接使用binder的transact来代替aidl接口
  • nacos从1.x升级到2.4.3问题记录
  • 【C++指南】模板 深度解析
  • 如何使用队列规则(Qdisc)发送数据包
  • Git | git reset命令详解
  • python安装完成后可以进行的后续步骤和注意事项
  • leetcode 2270. 分割数组的方案数 中等
  • 【WPS】【WORDEXCEL】【VB】实现微软WORD自动更正的效果
  • windows wsl ubuntu22 远程桌面连接
  • QT跨平台应用程序开发框架(1)—— 环境搭建
  • Redis集群的键分布机制
  • Y3编辑器地图教程:ORPG教程、防守图教程
  • 扩散模型学习
  • Arthas监控方法内部调用路径,并输出方法路径上的每个节点上耗时
  • 计算机网络之---端口与套接字