IO进程作业

本文介绍了一个使用父子进程并行复制图片的方法。通过父进程复制图片的前半部分,子进程复制后半部分,实现了文件的有效分割和高效复制。此方法避免了使用sleep函数来同步进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用文件IO拷贝一张图片,要求子进程拷贝后半部分,父进程拷贝前半部分。不允许使用sleep(1)函数。

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

int main(int argc, const char *argv[])
{
	int dp,ldp;   		//源文件,目标文件
	int res=1;         //接收read返回值的变量
	char str[60];         //字符串数组
	int count = 0;

	int len;            //文件长度
	len = lseek(dp,0,SEEK_END);//文件总大小byte

	pid_t pid = fork();        //创建子进程

	if(pid<0)           //判断是否创建成功
	{
		perror("fork");
		return -1;
	}
	else if(pid==0)
	{
		//子进程代码区
		dp=open("./1.bmp",O_RDONLY);//只读打开
		if(dp<0)              //判断是否打开成功
		{
			perror("open");
			return -1;
		}
		ldp=open("./copy.bmp",O_WRONLY|O_CREAT,0666);//只写打开,目标文件
		if(ldp<0)//判断是否打开成功
		{
			perror("open");
			return -1;
		}
		printf("子进程\n");
		lseek(dp,len/2,SEEK_SET);
		//光标偏移到文件中间的位置 
		lseek(ldp,len/2,SEEK_SET);
		while(1)
		{
			bzero(str,sizeof(str));//清空字符数组
			res=read(dp,str,sizeof(str));//读取字符串
			write(ldp,str,res);//写入字符串,注意只能写res个,不能写sizeof(str)个
			if(res==0)//读到结尾
				break;
			if(res<0)//读取失败
			{
				perror("read");
				return-1;
			}
			//	close(dp);
			//	close(ldp);
		}

	}
	else
	{
		//父进程代码区
		dp=open("./1.bmp",O_RDONLY);
		if(dp<0)
		{
			perror("open");
			return -1;
		}
		ldp=open("./copy.bmp",O_WRONLY|O_CREAT,0666);
		if(ldp<0)
		{
			perror("open");
			return -1;
		}
		printf("父进程\n");
		lseek(dp,0,SEEK_SET);
		lseek(ldp,0,SEEK_SET);
		while(res>0)
		{
			count +=res;
			res=read(dp,str,sizeof(str));
			write(ldp,str,res);
			if(count>=len/2)
				break;
		}
	}
	close(dp);//关闭目标文件
	close(ldp);//关闭源文件
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值