2.1 Day5

eg1:  要求显示指定路径下的所有文件的属性

运行结果

 

eg2:要求用父子进程拷贝一张图片,子进程先拷贝后半部分,父进程后拷贝前半部分。

         提示:用lseek, stat 获取文件大小。父进程起始位置:0~size/2。

                   子进程起始位置size/2~size

运行结果:

 代码段:

ubuntu@ubuntu:io$ vim ./2.png
ubuntu@ubuntu:io$ vim 2.png
ubuntu@ubuntu:io$ vim 2.png
ubuntu@ubuntu:io$ vim 2.png
ubuntu@ubuntu:io$ vim 2.png
ubuntu@ubuntu:io$ vim 2.png
ubuntu@ubuntu:io$ vim 2.png
ubuntu@ubuntu:io$ vim 2.png
ubuntu@ubuntu:io$ vim 2.png
ubuntu@ubuntu:io$ vim 2.png
ubuntu@ubuntu:io$ vim 2.png
ubuntu@ubuntu:io$ cat fork.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

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,0775);
	if(fd_w<0)
	{
		perror("open1");
		return -1;
	}	

    
	pid_t pid= fork();   //创建一个子进程
    //父子进程均会执行fork以下的代码
	//从指定文件中读取数据

 	
	if(pid > 0)     //在父进程中为真,子进程中为假
	{
		//获取文件的大小 
		off_t m=lseek(fd_r,0,SEEK_END); 
		off_t count=m/2;
		//读取一次,写一次,直到文件读取完毕 
		char buf; 
		ssize_t res = 0;

		//父进程执行   
		sleep(1);
		lseek(fd_r,0,SEEK_SET);
		lseek(fd_w,0,SEEK_SET);
		for(int i=0;i<count;i++)
		{ 
		//	bzero(buf, sizeof(buf)); 
			res = read(fd_r, &buf, sizeof(buf)); 
			if(res < 0) 
			{
				perror("read");
				return -1;
			}
			write(fd_w,&buf,sizeof(buf));
	
		}
	}
		else if(0 == pid)   //在父进程中为假,子进程中为真
		{
			//获取文件的大小  
			off_t m=lseek(fd_r,0,SEEK_END);  
			off_t count=m/2;
			//读取一次,写一次,直到文件读取完毕  
			char buf;  
			ssize_t res = 0; 
			//子进程运行 
			lseek(fd_r,count,SEEK_SET); 
			lseek(fd_w,count,SEEK_SET);
			while(1) 
			{ 
		//		bzero(buf, sizeof(buf)); 
				res = read(fd_r, &buf, sizeof(buf)); 
				if(0 == res) 
				{ 
					printf("文件读取完毕\n"); 
					break; 
				} 
				else if(res < 0) 
				{
					perror("read");
					return -1;
				}


				write(fd_w,&buf,sizeof(buf));

			}
		}
	else if(pid < 0)
	{
		perror("fork");
		return -1;
	}
	
	//关闭
	close(fd_r);
	close(fd_w);
   
    return 0;
}

            


  
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值