IO第3天

请使用文件IO函数拷贝一张图片

(图片就是普通文件,普通文件怎么拷贝,图片就怎么拷贝)

要求子进程拷贝后半部分,父进程拷贝前半部分。

ps: 是否拷贝成功打开可以打开图形化界面查看,

或者使用diff指令--》diff .png 2.png        eog 1.png

#include <myhead.h>
int main(int argc, const char *argv[])
{
	int pd_r=open("./cat.jpg",O_RDONLY); //打开读文件
	if(pd_r<0){
		perror("open");
		return -1;
	}

	//打开写的文件
	int pd_w=open("./cat1.jpg",O_WRONLY|O_CREAT|O_TRUNC,0664);
	if(pd_w<0)
	{
		perror("open");
		return -1;
	}

	//获取文件属性 方便计算大小
	struct stat buf;
	if(stat("./cat.jpg",&buf)<0){
		perror("stat");
		return -1;
	}

	//创建子进程
	pid_t pid=fork();
	if(pid>0){ //父进程

		//等待子进程拷贝后半段
		//然后重置偏移量插入前半段
		wait(NULL);

		lseek(pd_r,0,SEEK_SET); //重置偏移量
		lseek(pd_w,0,SEEK_SET);

		char c; //开始拷贝
		for(int i=0;i<buf.st_size;i++){
			read(pd_r,&c,sizeof(c));
			write(pd_w,&c,sizeof(c));
		}
		printf("前半部分拷贝完毕\n");

	}else if(0==pid){ //子进程

		lseek(pd_r,buf.st_size/2,SEEK_SET);
		lseek(pd_w,buf.st_size/2,SEEK_SET);

		char c;
		for(int i=buf.st_size/2;i<buf.st_size;i++){
			read(pd_r,&c,sizeof(c));
			write(pd_w,&c,sizeof(c));
		}
		printf("后半部分拷贝完毕\n");

	}else if(pid<0){

		perror("fork");
		return -1;
	}


	close(pd_r);
	close(pd_w);


	return 0;
}

孤儿进程

#include <myhead.h>
int main(int argc, const char *argv[])
{
	pid_t pid=fork();
	if(pid>0){ //父进程
		for(int i=0;i<1;i++){
			printf("this is parent\n");
		}
		printf("parent 退出\n"); //父进程已经结束
	}else if(pid==0){ //子进程
		for(int i=0;;i++){
			printf("this is child %d %d\n",getpid(),getppid());
			sleep(1);  //死循环子进程没有结束
		}
		printf("child 退出\n");
	}else if(pid<0){
		perror("fork");
		return -1;
	}
	return 0;
}

僵尸进程

#include <myhead.h>
int main(int argc, const char *argv[])
{
	pid_t pid=fork();

	if(pid>0){ //父进程 没有wait回收子进程的内存资源
		while(1)
		{
			sleep(1); //死循环
		}
	}else if(0==pid){
		printf("child:%d %d\n",getpid(),getppid());
		exit(0); //子进程结束

	}else if(pid<0){
		perror("fork");
		return -1;
	}
	return 0;
}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值