1> 使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上
一份
create.c
#include<myhead.h>int main(int argc, const char *argv[])
{//创建一个管道文件if(mkfifo("./linux",0664)==-1){perror("mkfifo error");return -1;} return 0;
}
snd.c
#include<myhead.h>int main(int argc, const char *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, const char *argv[])
{//以只读的形式打开管道文件int rfd=open("./linux",O_RDONLY);if(rfd==-1){perror("open error");return -1;}printf("管道文件已打开\n");//已只写的形式打开文件int fd1=open("./file.text",O_WRONLY|O_CREAT|O_TRUNC,0664);if(fd1==-1){perror("open error");return -1;} 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(fd1,rbuf,sizeof(rbuf));//手动添加换行char a='\n';write(fd1,&a,1);}//关闭文件close(rfd);close(fd1);return 0;
}
2> 使用有名管道实现两个进程间相互通信
create.c
#include<myhead.h>int main(int argc, const char *argv[])
{//创建管道1if(mkfifo("./liunx1",0664)==-1){perror("mkfifo error");return -1;}//创建管道2if(mkfifo("./liunx2",0664)==-1){perror("mkfifo error");return -1;} return 0;
}
snd.c
#include<myhead.h>int main(int argc, const char *argv[])
{//创建管道1if(mkfifo("./liunx1",0664)==-1){perror("mkfifo error");return -1;}//创建管道2if(mkfifo("./liunx2",0664)==-1){perror("mkfifo error");return -1;} return 0;
}
ubuntu@ubuntu:work2$ cat snd.c
#include<myhead.h>int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid<0){perror("fork error");return -1;}else if(pid==0){//以只写的形式打开管道2int wfd=open("./liunx2",O_WRONLY);if(wfd==-1){perror("open error");return -1;}char wbuf[128]="";while(1){printf("请输入>>>");//把终端输入的内容写入容器中fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;//再写入到管道文件中write(wfd,wbuf,strlen(wbuf));//判断写入的内容if(strcmp(wbuf,"quit")==0){break;}}//关闭文件close(wfd);exit(EXIT_SUCCESS);}//以只读的形式打开管道1int rfd=open("./liunx1",O_RDONLY);if(rfd==-1){perror("open error");return -1;}char rbuf[128]="";while(1){//清空容器bzero(rbuf,sizeof(rbuf));//读取管道1中的内容read(rfd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit")==0){break;} printf("收到的信息为:%s\n",rbuf);}//关闭文件close(rfd);wait(NULL);return 0;
}
recv.c
#include<myhead.h>int main(int argc, const char *argv[])
{pid_t pid=fork();if(pid<0){perror("fork error");return -1;}else if(pid==0){ //以只读的形式打开管道2int rfd=open("./liunx2",O_RDONLY);if(rfd==-1){perror("open error");return -1;}char rbuf[128]="";while(1){//清空容器bzero(rbuf,sizeof(rbuf));//读取管道1中的内容read(rfd,rbuf,sizeof(rbuf));if(strcmp(rbuf,"quit")==0){break;} printf("收到的信息为:%s\n",rbuf);}//关闭文件close(rfd);exit(EXIT_SUCCESS);}//以只写的形式打开管道1int wfd=open("./liunx1",O_WRONLY);if(wfd==-1){perror("open error");return -1;}char wbuf[128]="";while(1){printf("请输入>>>");//把终端输入的内容写入容器中fgets(wbuf,sizeof(wbuf),stdin);wbuf[strlen(wbuf)-1]=0;//再写入到管道文件中write(wfd,wbuf,strlen(wbuf));//判断写入的内容if(strcmp(wbuf,"quit")==0){break;}}//关闭文件close(wfd);wait(NULL);return 0;
}
思维导图