代码实现过程:
#include<stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>
#include <string.h>
char str[32]="";
int flag = 0;
pthread_mutex_t mutex;
struct sem{
sem_t sig;
sem_t sig1;
int fd;
int fd1;
};
ssize_t res = 0;
void *funcA(void *arg){
while(1){
//locking
sem_wait(&(((struct sem*)arg)->sig));
bzero(str,sizeof(str));
res = read(((struct sem*)arg)->fd,str,sizeof(str));
if(res == 0){
break;
}
sem_post(&(((struct sem*)arg)->sig1));
//unlocking
}
return NULL;
}
void *funcB(void *arg){
while(1){
//locking
sem_wait(&(((struct sem*)arg)->sig1));
if(res==0){
break;
}
write(((struct sem*)arg)->fd1,str,res);
// write(1,str,res);
sem_post(&(((struct sem*)arg)->sig));
//unlocking
}
return NULL;
}
int main(int argc, const char *argv[])
{
sem_t sem;
sem_t sem1;
sem_init(&sem,0,1);
sem_init(&sem1,0,0);
int fd = open("./1.c",O_RDONLY);
int fd1 = open("./copy.c",O_RDWR|O_CREAT|O_TRUNC,0664);
struct sem lock;
lock.sig=sem;
lock.sig1=sem1;
lock.fd=fd;
lock.fd1=fd1;
pthread_t tidA;
if(pthread_create(&tidA,NULL,funcA,&lock) != 0){
fprintf(stderr,"pthread_create A\n");
return -1;
}
pthread_t tidB;
if(pthread_create(&tidB,NULL,funcB,&lock) != 0){
fprintf(stderr,"pthread_create B\n");
return -1;
}
pthread_detach(tidB);
if(pthread_join(tidA,NULL) != 0){
fprintf(stderr,"pthread_join");
return -1;
}
/*
pid_t pid = fork();
if(pid == 0){
while(1){
printf("this is oprhan\n");
sleep(1);
}
}
else if(pid < 0){
perror("fork");
return -1;
}
*/
/*
pid_t pid = fork();
if(pid > 0){
while(1){
printf("abadoned a child\n");
sleep(1);
}
}
else if(pid < 0){
perror("fork");
return -1;
}*/
/*
//1.创建孤儿进程
if(fork() == 0){
//2.独立会话组
pid_t sid = setsid();
//3.更改运行目录
chdir("/");
//4.清空权限掩码
umask(0);
//5.清空文件描述符
for(int i=0;i<getdtablesize();i++){
close(i);
}
//功能代码
while(1){
sleep(1);
}
}
*/
return 0;
}
代码实现结果: