图片拷贝
#include "stdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>
#include <pthread.h>
volatile int p_r;
volatile int p_w;
volatile off_t size;
sem_t sem1, sem2;
void* callback1(void*arg)
{
sem_wait(&sem2);
lseek(p_r,0,SEEK_SET);
lseek(p_w,0,SEEK_SET);
char c;
for(int i=0;i<size/2;i++)
{
read(p_r,&c,1);
write(p_w,&c,1);
}
printf("父线程拷贝完毕\n");
sem_post(&sem1);
pthread_exit(NULL);
}
void*callback2(void*arg)
{
sem_wait(&sem1);
lseek(p_r,size/2,SEEK_SET);
lseek(p_w,size/2,SEEK_SET);
char arr[30];
ssize_t res=1;
while(res!=0)
{
res=read(p_r,arr,29);
write(p_w,arr,res);
}
printf(".............\n");
sem_post(&sem2);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
p_r=open("./1.png",O_RDONLY);
p_w=open("./3.png",O_WRONLY|O_CREAT|O_TRUNC,0777);
size=lseek(p_r,0,SEEK_END);
pthread_t tid1,tid2;
if(sem_init(&sem1,0,1)<0)
{
perror("sem_init");
return -1;
}
if(sem_init(&sem2,0,0)<0)
{
perror("sem_init");
return -1;
}
if(pthread_create(&tid1,NULL,callback1,NULL)!=0)
{
perror("pthread_create");
return -1;
}
if(pthread_create(&tid2,NULL,callback2,NULL)!=0)
{
perror("pthread_create");
return -1;
}
pthread_detach(tid2);
pthread_join(tid1,NULL);
sem_destroy(&sem2);
sem_destroy(&sem1);
printf("11111111111\n");
close(p_r);
close(p_w);
return 0;
}
#include "stdio.h"
#include <pthread.h>
#include "stdio.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int f=0;
void* callback1(void*arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
if(f==1||f==2)
{
pthread_cond_wait(&cond, &mutex);
}
if(f==0)
{
printf("A");
f=1;
}
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void* callback2(void*arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
if(f==0||f==2)
{
pthread_cond_wait(&cond, &mutex);
}
if(f==1)
{
printf("B");
f=2;
}
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
void* callback3(void*arg)
{
while(1)
{
pthread_mutex_lock(&mutex);
if(f==0||f==1)
{
pthread_cond_wait(&cond, &mutex);
}
if(f==2)
{
printf("C\n");
f=0;
}
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
pthread_t tid1,tid2,tid3;
if(pthread_create(&tid1,NULL,callback1,NULL)!=0)
{
perror("pthread_create");
return -1;
}
if(pthread_create(&tid2,NULL,callback2,NULL)!=0)
{
perror("pthread_create");
return -1;
}
if(pthread_create(&tid3,NULL,callback3,NULL)!=0)
{
perror("pthread_create");
return -1;
}
pthread_detach(tid2);
pthread_detach(tid3);
pthread_join(tid1,NULL);
return 0;
}