IO线程实现以下要求

本文探讨了如何使用两个线程分别实现字符串倒置和图片文件的并发复制,确保结果的正确性和顺序。第一个线程负责打印原始字符串,第二个线程在不借助额外数组的情况下,通过指针操作实现了字符串的逆序。在图片复制任务中,一个线程处理前半部分,另一个线程负责后半部分,以提高效率。
摘要由CSDN通过智能技术生成

1. 要求创建两个线程,以及一个全局变量,char str[] = "123456";要求如下:

1 )一个线程专门用于打印 str;
2 )另外一个线程专门用于倒置 str 字符串,不使用辅助数组。
3 )要求打印出来的结果必须是 123456 或者 654321 ,不能出现乱序情况,例如 623451 653421
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>

void *print_str(void *p)
{
	while(*(char*)p!='\0')
		printf("%c ",*(char*)p++);
	printf("\n");
}
void *reverse(void *p)
{
	int l=strlen((char*)p);
	int head=0,tail=l-1;
	char temp;
	while(head<tail){
		temp=((char*)p)[head];
		((char*)p)[head]=((char*)p)[tail];
		((char*)p)[tail]=temp;
		head++;
		tail--;
	}
	for(int i=0;i<l;i++)
		printf("%c ",((char*)p)[i]);
	printf("\n");
}
int main(int argc, const char *argv[])
{
	char str[]="123456";
	pthread_t p,t;
	if(pthread_create(&t,NULL,reverse,(void *)str)!=0){
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&p,NULL,print_str,(void *)str)!=0){
		perror("pthread_create");
		return -1;
	}
	sleep(1);
	return 0;
}

2. 要求用线程拷贝一张图片,一个线程拷贝前半部分,另一个线程拷贝后半部分

代码如下:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

void *print_str(void *p)
{
	lseek(((int*)p)[0],((int*)p)[2],SEEK_SET);
	lseek(((int*)p)[1],((int*)p)[2],SEEK_SET);
	char c;
	for(int i=0;i<((int*)p)[2]+((int*)p)[3];i++){
		read(((int*)p)[0],&c,1);
		write(((int*)p)[1],&c,1);
	}
}
void *reverse(void *p)
{
	sleep(1);
	lseek(((int*)p)[0],0,SEEK_SET);
	lseek(((int*)p)[1],0,SEEK_SET);
	char c;
	for(int i=0;i<((int*)p)[2];i++){
		read(((int*)p)[0],&c,1);
		write(((int*)p)[1],&c,1);
	}
}
int main(int argc, const char *argv[])
{
	int fd_r = open("./1.png", O_RDONLY);
	if(fd_r < 0)
	{
		perror("open");
		return -1;
	}
	int fd_w = open("./2.png", O_WRONLY|O_CREAT|O_TRUNC, 0664);
	if(fd_w < 0)
	{
		perror("open");
		return -1;
	}
	struct stat pstat;
	if(stat("./1.png", &pstat) < 0)
	{
		perror("stat");
		return -1;
	}
	off_t size = pstat.st_size;
	printf("size=%ld\n", size);
	off_t half_size = size/2;
	int flag = size%2;
	int arr[10];
	pthread_t p,t;
	if(pthread_create(&t,NULL,reverse,(void *)arr)!=0){
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&p,NULL,print_str,(void *)arr)!=0){
		perror("pthread_create");
		return -1;
	}
	arr[0]=fd_r;
	arr[1]=fd_w;
	arr[2]=half_size;
	arr[3]=flag;
	sleep(2);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值