Linux作业

该程序通过fork()创建父子进程,子进程拷贝图片的前半部分至新文件,父进程在子进程完成后拷贝图片的后半部分至另一个新文件。不使用sleep函数,而是利用进程间的同步机制。文件操作包括open(),read(),write()和close()系统调用。
摘要由CSDN通过智能技术生成

2023-5-6作业

使用文件IO函数,拷贝一张图片,父进程拷贝前半部饭紫禁城拷贝后半部分。不能使用sleep函数。提示1.一个进程拷贝完毕后再开始另外一个进程。2.父子进程各自开各自的文件。

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
int main(int argc, const char *argv[])
{
	pid_t cpid=fork();
	if(cpid==0)    //创建子进程
	{int fp=open("./pic.png",O_RDONLY),i=0;    // 获取原始图片文件
		if(fp<0){perror("open");return -1;}
		int fq=open("./copy.png",O_WRONLY|O_CREAT,0664); //创建新的文件
		if(fq<0){perror("open");return -1;}
		ssize_t res_o=0;char buf[32]="";

		while(i<762){bzero(buf,sizeof(buf));    //把文件上半部分信息拷贝到另一个文件过程
			res_o=read(fp,buf,sizeof(buf));
			write(fq,buf,res_o);i++;}
		if(fq<0){exit(errno);}        //返回错误信息
		else{close(fp);exit(0);}        //返回父进程

	else if(cpid>0)    //父进程
	{int wstatus;pid_t wpid=wait(&wstatus);
		if(wpid<0){perror("wait");return -1;}
		if((wstatus&0xff00)>>8==0)
		{int fp=open("./pic.png",O_RDONLY),i=0;
			if(fp<0){perror("open");return -1;}
			int fq=open("./copy1.png",O_WRONLY|O_CREAT,0664);
			if(fq<0){perror("open");return -1;}
			ssize_t res_o;char buf[32]="";

			while(i<762){bzero(buf,sizeof(buf));     //将下半部分信息拷贝到另一个文件过程
				res_o=read(fp,buf,sizeof(buf));
				write(fq,buf,res_o);i++;}
			if(close(fp)<0){perror("close");return -1;}    //关闭文件
			if(close(fq)<0){perror("close");return -1;}}}    //关闭文件

	else {perror("fork");return -1;} //返回错误信息
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值