一.作业
1> 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
create.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
//创建一个有名管道文件
if(mkfifo("./linux",0664)==-1)
{
perror("mkfifo error");
return -1;
}
getchar();
system("rm linux");
return 0;
}
snd.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
//以只写的形式打开管道文件
int wfd=open("./linux",O_WRONLY);
if (wfd==-1)
{
perror("open error");
return -1;
}
printf("管道文件已经打开\n");
//发送数据
char wbuf[128]="";
while (1)
{
printf("请输入>>>");
fgets(wbuf,sizeof(wbuf),stdin);
wbuf[strlen(wbuf)-1]=0;
//将数据发送到管道中
write(wfd,wbuf,sizeof(wbuf));
if (strcmp(wbuf,"quit")==0)
{
break;
}
}
close(wfd);
return 0;
}
recv.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
// 以只读的形式打开管道文件
int rfd = open("./linux", O_RDONLY);
// 以只写的形式打开存储文件
int fd = open("./file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0664);
if (fd == -1)
{
perror("open error");
return -1;
}
if (rfd == -1)
{
perror("open error");
return -1;
}
printf("管道文件读端打开\n");
// 定义接受数据容器
char rbuf[128] = "";
while (1)
{
bzero(rbuf, sizeof(rbuf));
// 读取数据
read(rfd, rbuf, sizeof(rbuf));
if (strcmp(rbuf, "quit") == 0)
{
break;
}
printf("收到的消息:%s\n", rbuf);
write(fd,rbuf,strlen(rbuf));
write(fd,"\n",1);
}
close(rfd);
return 0;
}
2> 使用有名管道实现两个进程间相互通信
create.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
//创建一个有名管道文件
if(mkfifo("./linux1",0664)==-1)
{
perror("mkfifo error");
return -1;
}
if(mkfifo("./linux2",0664)==-1)
{
perror("mkfifo error");
return -1;
}
getchar();
system("rm linux1");
system("rm linux2");
return 0;
}
A.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
// 以只写的形式打开管道文件1
int wfd = open("./linux1", O_WRONLY);
if (wfd == -1)
{
perror("open error");
return -1;
}
printf("1管道文件已经打开\n");
// 以只读的形式打开管道文件2
int rfd = open("./linux2", O_RDONLY);
if (rfd == -1)
{
perror("open error");
return -1;
}
printf("2管道文件读端打开\n");
pid_t pid = 0;
pid = fork();
// 发送数据
if (pid > 0) // A父进程
{
char wbuf[128] = "";
while (1)
{
fgets(wbuf, sizeof(wbuf), stdin);
wbuf[strlen(wbuf) - 1] = 0;
// 将数据发送到管道中
write(wfd, wbuf, sizeof(wbuf));
if (strcmp(wbuf, "quit") == 0)
{
break;
}
}
close(wfd);
wait(NULL);
exit(EXIT_SUCCESS);
}
else if (pid == 0) // A子进程
{
// 定义接受数据容器
char rbuf[128] = "";
while (1)
{
bzero(rbuf, sizeof(rbuf));
// 读取数据
read(rfd, rbuf, sizeof(rbuf));
if (strcmp(rbuf, "quit") == 0)
{
break;
}
printf("A收到的消息:%s\n", rbuf);
}
close(rfd);
exit(EXIT_SUCCESS);
}
else
{
perror("fork error");
return -1;
}
return 0;
}
B.c
#include <myhead.h>
int main(int argc, char const *argv[])
{
// 以只读的形式打开管道文件1
int rfd = open("./linux1", O_RDONLY);
if (rfd == -1)
{
perror("open error");
return -1;
}
printf("2管道文件读端打开\n");
// 以只写的形式打开管道文件2
int wfd = open("./linux2", O_WRONLY);
if (wfd == -1)
{
perror("open error");
return -1;
}
printf("1管道文件已经打开\n");
pid_t pid = 0;
pid = fork();
// 接受数据
if (pid > 0) // B父进程
{
// 定义接受数据容器
char rbuf[128] = "";
while (1)
{
bzero(rbuf, sizeof(rbuf));
// 读取数据
read(rfd, rbuf, sizeof(rbuf));
if (strcmp(rbuf, "quit") == 0)
{
break;
}
printf("B收到的消息:%s\n", rbuf);
}
close(rfd);
wait(NULL);
exit(EXIT_SUCCESS);
}
else if (pid == 0) // B子进程
{
// 发送数据
char wbuf[128] = "";
while (1)
{
fgets(wbuf, sizeof(wbuf), stdin);
wbuf[strlen(wbuf) - 1] = 0;
// 将数据发送到管道中
write(wfd, wbuf, sizeof(wbuf));
if (strcmp(wbuf, "quit") == 0)
{
break;
}
}
close(wfd);
exit(EXIT_SUCCESS);
}
else
{
perror("fork error");
return -1;
}
return 0;
}