作业1:使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
create.c
#include<myhead.h>
//创建通道
int main()
{
if(mkfifo("./lz",0664)==-1)
{
perror("mkfifo error");
return -1;
}
printf("通道已开启,摁回车关闭\n");
getchar();
system("rm lz");
return 0;
}
send.c
#include<myhead.h>
int main()
{
int wfd=open("./lz",O_WRONLY);
if(wfd==-1)
{
perror("open error");
return -1;
}
char buf[128]="";
while(1)
{
printf("请输入>>>");
//从终端读取数据
fgets(buf,sizeof(buf),stdin);
//最后一位换成'\0'
buf[strlen(buf)-1]=0;
//写入通道
write(wfd,buf,strlen(buf));
//判断结束
if(strcmp(buf,"quit")==0)
{
break;
}
}
//关闭通道写入
close(wfd);
return 0;
}
recv.c
#include<myhead.h>
int main()
{
int wfd=open("./lz",O_RDONLY);
if(wfd==-1)
{
perror("open error");
return -1;
}
int pt=-1;
if((pt=open("./text.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open error");
return -1;
}
char buf[128]="";
while(1)
{
//清空
bzero(buf, sizeof(buf));
//从通道读取数据
read(wfd, buf, sizeof(buf));
//判断离开
if(strcmp(buf,"quit")==0)
{
break;
}
printf("收到%s\n",buf);
//写入文件
write(pt,buf,strlen(buf));
}
//关闭文件指针
close(pt);
//关闭通道读写
close(wfd);
return 0;
}
作业2:使用有名管道实现两个进程间相互通信
create.c
#include<myhead.h>
//创建通道
int main()
{
if(mkfifo("./lz1",0664)==-1)
{
perror("mkfifo error");
return -1;
}
if(mkfifo("./lz2",0664)==-1)
{
perror("mkfifo error");
return -1;
}
printf("通道已开启,摁回车关闭\n");
getchar();
system("rm lz1 lz2");
return 0;
}
usr1.c
#include<myhead.h>
int main()
{
char buf[128]="";
pid_t pid=fork();
if(pid<0)
{
perror("pid error");
return -1;
}else if(pid>0)
{
//父进程打开通道1写入
int wfd1=open("./lz1",O_WRONLY);
if(wfd1==-1)
{
perror("open error");
return -1;
}
while(1)
{
printf("请输入>>>");
//从终端读取数据
fgets(buf,sizeof(buf),stdin);
//最后一位换成'\0'
buf[strlen(buf)-1]=0;
//写入通道
write(wfd1,buf,strlen(buf));
//判断结束
if(strcmp(buf,"quit")==0)
{
break;
}
}
//关闭通道写入
close(wfd1);
}else{
//子进程打开通道2读取
int wfd2=open("./lz2",O_RDONLY);
if(wfd2==-1)
{
perror("open2 error");
return -1;
}
while(1)
{
//清空
bzero(buf, sizeof(buf));
//从通道读取数据
read(wfd2, buf, sizeof(buf));
//判断离开
if(strcmp(buf,"quit")==0)
{
break;
}
printf("收到%s\n",buf);
}
//关闭通道写入
close(wfd2);
}
return 0;
}
usr2.c
#include<myhead.h>
int main()
{
//定义搬运工
char buf[128]="";
//创建进程
pid_t pid=fork();
if(pid<0)
{
perror("pid error");
return -1;
}else if(pid==0)
{
//子进程打开通道2写入
int wfd2=open("./lz2",O_WRONLY);
if(wfd2==-1)
{
perror("open error");
return -1;
}
while(1)
{
printf("请输入>>>");
//从终端读取数据
fgets(buf,sizeof(buf),stdin);
//最后一位换成'\0'
buf[strlen(buf)-1]=0;
//写入通道
write(wfd2,buf,strlen(buf));
//判断结束
if(strcmp(buf,"quit")==0)
{
break;
}
}
//关闭通道写入
close(wfd2);
}else{
//父进程打开通道1读取
int wfd1=open("./lz1",O_RDONLY);
if(wfd1==-1)
{
perror("open error");
return -1;
}
while(1)
{
//清空
bzero(buf, sizeof(buf));
//从通道读取数据
read(wfd1, buf, sizeof(buf));
//判断离开
if(strcmp(buf,"quit")==0)
{
break;
}
printf("收到%s\n",buf);
}
//关闭通道读取
close(wfd1);
}
return 0;
}