1、使用有名管道完成两个进程的互相通信
//创建2个有名管道
#include <myhead.h>
int main(int argc, const char *argv[])
{
if(mkfifo("myfifo",0664)==-1)
{
perror("mkfifo error");
return -1;
}
if(mkfifo("ufifo",0664)==-1)
{
perror("mkfifo error");
return -1;
}
printf("是否关闭,关闭请回车");
getchar();
system("rm myfifo");
system("rm ufifo");
return 0;
}
//右边对话框
#include <myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid2;
pid2=fork();
if(pid2>0)
{
int wfd=-1;
if((wfd=open("./myfifo",O_WRONLY))==-1)
{
perror("wfd open error");
}
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);
}
else if(pid2==0)
{
int rrfd=-1;
if((rrfd=open("./ufifo",O_RDONLY))==-1)
{
perror("wwfd open error");
}
char rrbuf[128]="";
while(1)
{
bzero(rrbuf,sizeof(rrbuf));
read(rrfd,rrbuf,sizeof(rrbuf));
printf("\n左边输出:%s\n",rrbuf);
if(strcmp(rrbuf,"quit")==0)
{
break;
}
}
close(rrfd);
}//读取管道内容
return 0;
}
//左边对话框
#include <myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid;
pid=fork();
if(pid>0)
{
int rfd=-1;
if((rfd=open("./myfifo",O_RDONLY))==-1)
{
perror("rfd open error");
return -1;
}//打开管道
char rbuf[128]="";
while(1)
{
bzero(rbuf,sizeof(rbuf));
read(rfd,rbuf,sizeof(rbuf));
printf("\n右边输出:%s\n",rbuf);
if(strcmp(rbuf,"quit")==0)
{
break;
}
}
close(rfd);
}//读取管道内容
else if(pid==0)
{
int wwfd=-1;
if((wwfd=open("./ufifo",O_WRONLY))==-1)
{
perror("rrfd open error");
return -1;
}
char wwbuf[128]="";
while(1)
{
printf("请输入>>>");
fgets(wwbuf,sizeof(wwbuf),stdin);
wwbuf[strlen(wwbuf)-1]=0;
write(wwfd,wwbuf,sizeof(wwbuf));
if(strcmp(wwbuf,"quit")==0)
{
break;
}
}
close(wwfd);
}//管道内容输入
return 0;
}
2、使用无名管道完成父子进程间的通信
#include <myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid=-1;
int pipefd[2];
if(pipe(pipefd)==-1)
{
perror("pipe error");
return -1;
}
printf("pipefd[0]=%d,pipefd[1]=%d\n",pipefd[0],pipefd[1]);
pid=fork();//父子进程
if(pid>0)
{
close(pipefd[0]);
char buf[128]="";
while(1)
{
fgets(buf,sizeof(buf),stdin);//给管道写入
buf[strlen(buf)-1]=0;//\n换成\0
write(pipefd[1],buf,sizeof(buf));
if(strcmp(buf,"quit")==0)
{
break;
}
}
close(pipefd[1]);
}
else if(pid==0)
{
close(pipefd[1]);
char rbuf[128]="";
while(1)
{
bzero(rbuf,sizeof(rbuf));
read(pipefd[0],rbuf,sizeof(rbuf));//输出管道内容
printf("父进程传送了一条消息:\n%s\n",rbuf);
if(strcmp(rbuf,"quit")==0)
{
break;
}
}
close(pipefd[0]);
exit(EXIT_SUCCESS);
}
else
{
perror("fork error");
return -1;
}
wait(NULL);
return 0;
}
#include <myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid=-1;
int pipefd[2];
if(pipe(pipefd)==-1)
{
perror("pipe error");
return -1;
}
printf("pipefd[0]=%d,pipefd[1]=%d\n",pipefd[0],pipefd[1]);
pid=fork();
if(pid>0)
{
close(pipefd[0]);
char buf[128]="";
while(1)
{
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]=0;//\n换成\0
write(pipefd[1],buf,sizeof(buf));
if(strcmp(buf,"quit")==0)
{
break;
}
}
close(pipefd[1]);
}
else if(pid==0)
{
close(pipefd[1]);
char rbuf[128]="";
while(1)
{
bzero(rbuf,sizeof(rbuf));
read(pipefd[0],rbuf,sizeof(rbuf));
printf("父进程传送了一条消息:\n%s\n",rbuf);
if(strcmp(rbuf,"quit")==0)
{
break;
}
}
close(pipefd[0]);
exit(EXIT_SUCCESS);
}
else
{
perror("fork error");
return -1;
}
wait(NULL);
return 0;
}
3、使用标准IO完成两个文件的拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{
FILE *fp;
fp=fopen("./text.txt","r");
FILE *fp2;
fp2=fopen("./text1.txt","w");
char str[128]="";
fgets(str,sizeof(str)-1,fp);
fputs(str,fp2);
return 0;
}
4、使用文件IO完成两个文件的拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{
int fd=-1;
if((fd=open("./text.txt",O_RDONLY))==-1)
{
perror("fd error");
return -1;
}
int fd1=-1;
if((fd1=open("./text1.txt",O_RDWR|O_CREAT|O_TRUNC,0664))==-1)
{
perror("fd1 error");
return -1;
}
char str[128]="";
while(1)
{
int res=read(fd,str,sizeof(str)-1);
if(res==0)
{
return 0;
}
write(fd1,str,res);
}
return 0;
}
4、使用多进程完成两个文件的拷贝
#include <myhead.h>
int main(int argc, const char *argv[])
{
char str[128]="";
char *p=str;
int res;
int fd=-1;
if((fd=open("./text.txt",O_RDONLY))==-1)
{
perror("fd error");
return -1;
}
printf("fd=%d\n",fd);
res=read(fd,p,sizeof(str));
puts(p);
if(res==0)
{
return 0;
}
puts("子进程");
wait(NULL);
pid_t pid=-1;
pid=fork();
if(pid>0)
{
int fd1=-1;
if((fd1=open("./text1.txt",O_RDWR|O_CREAT|O_TRUNC,0664))==-1)
{
perror("fd1 error");
return -1;
}
printf("fd1=%d\n",fd1);
write(fd1,p,res);
puts(p);
exit(EXIT_SUCCESS);
}
else if(pid==0)
{
}
else
{
perror("pid error");
}
return 0;
}
5、使用多线程完成两个文件的拷贝
#include <myhead.h>
void *task1(void *p)
{
int fd=-1;
if((fd=open("./text.txt",O_RDONLY))==-1)
{
perror("fd error");
}
read(fd,(char*)p,128);
printf("%s",(char*)p);
printf("线程1退出\n");
pthread_exit(NULL);
}
void *task2(void *arg)
{
int fd=-1;
if((fd=open("./text1.txt",O_RDWR|O_CREAT|O_TRUNC,0664))==-1)
{
perror("fd1 error");
}
write(fd,(char*)arg,strlen((char*)arg));
printf("线程1退出\n");
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
static char str[128]="";
pthread_t tid1=-1;
if(pthread_create(&tid1,NULL,task1,&str)!=0)
{
printf("tid1 create error\n");
return -1;
}
pthread_t tid2=-1;
if(pthread_create(&tid2,NULL,task2,&str)!=0)
{
printf("tid2 create error\n");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}