使用有名管道实现两个进程的相互通信
1. 两个有名管道
#include <myhead.h>
int main(int argc, const char *argv[])
{
if(mkfifo("myfifo1",0664)==-1)
{
perror("myfifo1 error");
return -1;
}
getchar();
system("rm myfifo1");
return 0;
}
#include <myhead.h>
int main(int argc, const char *argv[])
{
if(mkfifo("myfifo",0664)==-1)
{
perror("myfifo error");
return -1;
}
getchar();
system("rm myfifo");
return 0;
}
2.进程
#include <myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid1=-1;
pid1=fork();
if(pid1>0)
{
int wfd1=-1;
if((wfd1=open("./myfifo",O_WRONLY))==-1)
{
perror("wfd1 open error");
return -1;
}
char wa[128]="";
while(1)
{
printf("请输入:");
fgets(wa,sizeof(wa),stdin);
wa[strlen(wa)-1]=0;
write(wfd1,wa,sizeof(wa));
if(strcmp(wa,"quit")==0)
break;
}
close(wfd1);
wait(NULL);
}else if(pid1==0)
{
int rfd1=-1;
if((rfd1=open("./myfifo1",O_RDONLY))==-1)
{
perror("rfd1 open error");
return -1;
}
char ra[128]="";
while(1)
{
bzero(ra,sizeof(ra));
read(rfd1,ra,sizeof(ra));
printf("收到一条信息:%s",ra);
fflush(stdout);
if(strcmp(ra,"quit")==0)
break;
}
close(rfd1);
exit(0);
}else
{
perror("fork error");
return -1;
}
return 0;
}
#include <myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid2=-1;
pid2=fork();
if(pid2>0)
{
int rfd2=-1;
if((rfd2=open("./myfifo",O_RDONLY))==-1)
{
perror("rfd2 open error");
return -1;
}
char ra[128]="";
while(1)
{
bzero(ra,sizeof(ra));
read(rfd2,ra,sizeof(ra));
printf("收到一条信息:%s\n",ra);
if(strcmp(ra,"quit")==0)
break;
}
close(rfd2);
wait(NULL);
}else if(pid2==0)
{
int wfd2=-1;
if((wfd2=open("./myfifo1",O_WRONLY))==-1)
{
perror("wfd2 open error");
return -1;
}
char wa[128]="";
while(1)
{
printf("请输入:");
fgets(wa,sizeof(wa),stdin);
wa[strlen(wa)]=0;
write(wfd2,wa,sizeof(wa));
if(strcmp(wa,"quit")==0)
break;
}
close(wfd2);
exit(0);
}else
{
perror("fork error");
return -1;
}
return 0;
}
效果图:
使用无名管道实现父子进程之间的通信
#include <myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid=-1;
int pipefd[2]={0};
if(pipe(pipefd)==-1)
{
perror("pipe error");
return -1;
}
pid=fork();
if(pid>0)
{
close(pipefd[0]);
char wa[128]="";
while(1)
{
fgets(wa,sizeof(wa),stdin);
wa[strlen(wa)-1]=0;
write(pipefd[1],wa,sizeof(wa));
if(strcmp(wa,"quit")==0)
break;
}
close(pipefd[1]);
}else if(pid==0)
{
close(pipefd[1]);
char ra[128]="";
while(1)
{
bzero(ra,sizeof(ra));
read(pipefd[0],ra,sizeof(ra));
printf("收到消息=%s\n",ra);
if(strcmp(ra,"quit")==0)
break;
}
close(pipefd[0]);
}else
{
perror("fork error");
return -1;
}
return 0;
}
效果图
使用标准IO完成拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{
FILE *fp;
FILE *rfp;
if((fp=fopen("./Text.txt","w"))==NULL)
{
perror("fopen error w");
return -1;
}
if((rfp=fopen("./text.txt","w"))==NULL)
{
perror("fopen error w");
return -1;
}
char a[128]="aaaaa";
fwrite(a,strlen(a),1,fp);
fclose(fp);
fclose(rfp);
if((fp=fopen("./Text.txt","r"))==NULL)
{
perror("fopen error r");
return -1;
}
if((rfp=fopen("./text.txt","w"))==NULL)
{
perror("fopen error w");
return -1;
}
char ra[128]="";
while(1)
{
int res=fread(ra,1,sizeof(ra),fp);
if(0==res)
break;
fwrite(ra,1,res,rfp);
}
fclose(fp);
fclose(rfp);
return 0;
}
使用文件IO完成拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{
int fd=-1;
int rfd=-1;
if((fd=open("./Tset.txt",O_RDWR|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open error r+");
return -1;
}
char a[128]="hello world";
write(fd,a,strlen(a));
close(fd);
if((fd=open("./Tset.txt",O_RDONLY))==-1)
{
perror("open error r");
return -1;
}
if((rfd=open("./test.txt",O_WRONLY|O_CREAT|O_TRUNC,0664))==-1)
{
perror("open error w");
return -1;
}
char ra[128]="";
int res=0;
while((res=read(fd,ra,sizeof(ra)))!=0)
{
write(rfd,ra,res);
}
close(fd);
close(rfd);
return 0;
}