作业: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;
}
结果