IO:创建两个线程完成图片拷贝,创建编号为ABC三个线程,三个线程循环打印自己的编号,要求打印出来的结果必须是ABC;无名管道(pipe)

 1,创建两个线程完成图片拷贝,一个线程拷贝一半。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

typedef struct
{
	int fr_r;
	int fr_w;
	long int size;
}duxie;

void *xianchanga(void* arg)
{
	printf("%ld\n",((duxie*)arg)->size);
	pthread_mutex_lock(&mutex);
	//偏移量
	lseek(((duxie*)arg)->fr_r,0,SEEK_SET);
	lseek(((duxie*)arg)->fr_w,0,SEEK_SET);

	//读写
	for(int i=0;i<(((duxie*)arg)->size)/2;i++)
	{
		char a;
		read(((duxie*)arg)->fr_r,&a,1);
		write(((duxie*)arg)->fr_w,&a,1);
	}
	printf("前半部分打印完毕\n");
	pthread_mutex_unlock(&mutex);
}



void *xianchangb(void* arg)
{
	pthread_mutex_lock(&mutex);
	//偏移量
	lseek(((duxie*)arg)->fr_r,(((duxie*)arg)->size)/2,SEEK_SET);
	lseek(((duxie*)arg)->fr_w,(((duxie*)arg)->size)/2,SEEK_SET);

	//读写
	for(int i=0;i<((duxie*)arg)->size/2+1;i++)
	{
		char a;
		read(((duxie*)arg)->fr_r,&a,1);
		write(((duxie*)arg)->fr_w,&a,1);
	}
	printf("后半部分打印完毕\n");
	pthread_mutex_unlock(&mutex);
}



int main(int argc, const char *argv[])
{
	duxie* pa=(duxie*)malloc(sizeof(duxie));
	umask(0);
	pa->fr_r=open("./1.png",O_RDONLY);
	pa->fr_w=open("./cpy.png",O_WRONLY|O_CREAT|O_TRUNC,0777);
	pa->size=lseek(pa->fr_r,0,SEEK_END);


	
	pthread_t the;
	int pth=pthread_create(&the,NULL,xianchanga,(void*)pa);
	if(pth!=0)
	{
		printf("this is shibai\n");
		return -1;
	}

	pthread_t the1;
	int pth1=pthread_create(&the1,NULL,xianchangb,(void*)pa);
	if(pth1!=0)
	{
		printf("this is shibai\n");
		return -1;
	}

	pthread_join(the,NULL);
	pthread_join(the1,NULL);


	close(pa->fr_r);
	close(pa->fr_w);	
	return 0;
}

运行结果

2,创建编号为ABC三个线程,三个线程循环打印自己的编号,要求打印出来的结果必须是ABC;

信号灯实现

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <pthread.h>  
#include <unistd.h>  
#include <semaphore.h>

#define BUF_SIZE 8  
  
char charbuf[BUF_SIZE] = "1234567";  
sem_t sem1,sem2,sem3;

  
// A线程的函数  
void *thread_A(void *arg) {  
    while (1) { 
		//临界区
		//p操作
		sem_wait(&sem1);
	    printf("A\n"); 
		//v操作
		sem_post(&sem2);
		//临界区//
          
    }  
    return NULL;  
}  
  
// B线程的函数  
void *thread_B(void *arg) {  
	while (1) {
		临界区/
		//p操作
		sem_wait(&sem2);
		printf("B\n");
		//v操作
		sem_post(&sem3);
		临界区///
	}  
	return NULL;  
}  

//C线程函数
void *thread_C(void *arg)
{
	while(1)
	{
	临界区
	//P操作
	sem_wait(&sem3);
	printf("C\n");
	//v操作
	sem_post(&sem1);
	临界区/
	}
}
  
int main(int argc, const char *argv[])
{
	
	//创建信号灯
	sem_init(&sem1,0,1);
	sem_init(&sem2,0,0);
	sem_init(&sem3,0,0);

    pthread_t thread_a, thread_b,thread_c;  
  
    // 创建A线程  
    if (pthread_create(&thread_a, NULL, thread_A,NULL) != 0) {  
        fprintf(stderr, "Error creating thread A\n");  
        return 1;  
    }  
  
    // 创建B线程  
    if (pthread_create(&thread_b, NULL, thread_B, NULL) != 0) {  
        fprintf(stderr, "Error creating thread B\n");  
        return 1;  
    }

	//创建C线程
	if (pthread_create(&thread_c, NULL, thread_C, NULL) != 0) {  
		fprintf(stderr, "Error creating thread B\n");  
		return 1;  
	}

	pthread_join(thread_a,NULL);
	pthread_join(thread_b,NULL);
	pthread_join(thread_c,NULL);

	//接触信号灯
	sem_destroy(&sem1);
	sem_destroy(&sem2);
	return 0;  
}

3,无名管道(pipe)

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>


int main(int argc, const char *argv[])
{
	//创建无名管道
	int pd[2];
	if(pipe(pd)<0)
	{
		perror("pipe");
		return -1;
	}


	char buff[128]="";
	pid_t pid=fork();
	if(pid>0)
	{
		while(1)
		{
			fgets(buff,sizeof(buff),stdin);
			buff[strlen(buff)-1]='\0';
			//strcpy(buff,"hello");
			//父进程
			write(pd[1],buff,sizeof(buff));
			printf("写入成功:%s__%d\n",buff,__LINE__);
	
		}
	}
	else if(pid==0)
	{
		while(1)
		{
			//子进程
			read(pd[0],buff,sizeof(buff));
			printf("成功读出:%s __%d\n",buff,__LINE__);
			sleep(1);
		}
	}
	else
	{
		perror("fork");
		return -1;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值