用双进程实现拷贝
#include<stdio.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<pthread.h>
#include<semaphore.h>
#include<strings.h>
sem_t sem;
char str[20]="";
ssize_t res=1;
int fd_r;
void *A(void *arg)
{
while(res!=0)
{
sem_wait(&sem);
if(str[0]=='\0')
{
res=read(fd_r,str,sizeof(str)-1);
}
sem_post(&sem);
}
pthread_exit(NULL);
}
void *B(void *arg)
{
while(res!=0)
{
sem_wait(&sem);
if(str[0]!='\0')
{
write(1,str,res);
}
bzero(str,sizeof(str));
sem_post(&sem);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
fd_r=open("./01_sen.c",O_RDONLY);
if(fd_r<0)
{
printf("open");
return -1;
}
if(sem_init(&sem,0,1)<0)
{
perror("sem_init");
return -1;
}
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,A,NULL)!=0)
{
perror("pthread_create1");
return -1;
}
if(pthread_create(&tid2,NULL,B,NULL)!=0)
{
perror("pthread_create2");
return -1;
}
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
close(fd_r);
sem_destroy(&sem);
return 0;
}
用父子进程实现对话
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
int main(int argc, const char *argv[])
{
//创建无名管道
int pfd1[2]={0};
if(pipe(pfd1)<0)
{
perror("pipe");
return -1;
}
printf("pipe creat success pfd1[0]=%d pfd1[1]=%d\n",pfd1[0],pfd1[1]);
//创建无名管道
int pfd2[2]={0};
if(pipe(pfd2)<0)
{
perror("pipe");
return -1;
}
printf("pipe creat success pfd2[0]=%d pfd2[1]=%d\n",pfd2[0],pfd2[1]);
char buf[128]="";
ssize_t res=0;
//创建一个子进程
pid_t pid =fork();
if(pid>0) //父进程为真
{
while(1)
{
printf("父进程说>>>");
//从终端获取数据
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0'; //将终端获取的'\n'修改成\0
//发送给子进程
if((res=write(pfd1[1],buf,sizeof(buf)))<0)
{
perror("write");
return -1;
}
printf("发送成功1\n");
if(strcmp(buf,"quit")==0)
{
break;
}
//读取子进程发送过来的数据
//当管道中没有数据的时候read函数阻塞
res=read(pfd2[0],buf,sizeof(buf));
if(res<0)
{
perror("read");
return -1;
}
else if(0==res)
{
printf("写端全部关闭\n");
return -1;
}
printf("父进程知晓\n");
if(strcmp(buf,"quit")==0)
{
break;
}
}
wait(NULL);
}
else if(0==pid) //子进程为真
{
while(1)
{
bzero(buf,sizeof(buf));
//读取父进程发送过来的数据
//当管道中没有数据的时候read函数阻塞
res=read(pfd1[0],buf,sizeof(buf));
if(res<0)
{
perror("read");
return -1;
}
else if(0==res)
{
printf("写端全部关闭\n");
return -1;
}
printf("子进程收到!\n");
if(strcmp(buf,"quit")==0)
{
break;
}
printf("子进程说>>>");
//从终端获取数据
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1]='\0'; //将终端获取的'\n'修改成\0
//发送给父进程
if((res=write(pfd2[1],buf,sizeof(buf)))<0)
{
perror("write");
return -1;
}
printf("发送成功\n");
if(strcmp(buf,"quit")==0)
{
break;
}
}
wait(NULL);
}
else{
perror("fork");
return -1;
}
return 0;
}