IO学习day4
一、思维导图
进程概念
进程函数
特殊进程
二、练习
使用父子进程实现一个图片的拷贝
要求父进程拷贝前一部分
子进程拷贝后一部分
使用diff查看两个文件是否相同
父进程读取前一半数据
子程序读取一半
#include <head.h>
int main(int argc, const char *argv[])
{
//打开图片
int fd=open("./xiaoxin - 副本.bmp",O_RDONLY);
if(fd==-1)
PRINT_ERROR("open errpr");
//获取图片大小
int size;
lseek(fd,2,SEEK_SET);
if(read(fd,&size,sizeof(size))<=0)
PRINT_ERROR("read error");
printf("size=%d\n",size);
//找到图片的数据内容
//lseek(fd,54,SEEK_SET);
//产生父子进程
pid_t cpid=fork();
lseek(fd,0,SEEK_SET);
int i=size/2;
//父进程
if(cpid>0)
{
//打开一个文件存前一部分
int fd1=open("./1.bmp",O_RDWR | O_CREAT,0664);
if(fd1==-1)
PRINT_ERROR("1-error");
//write写入数据
unsigned char str1[i];
ssize_t a=read(fd,str1,i);
printf("a=%ld\n",a);
ssize_t res=write(fd1,str1,sizeof(str1));
if(res==-1)
PRINT_ERROR("write error");
printf("res=%ld\n",res);
int m;
wait(&m);
close(fd1);
}
//子进程
else if(cpid==0)
{
//打开文件并将光标定位到后一半
int fd1=open("./1.bmp",O_RDWR | O_CREAT,0664);
if(fd1==-1)
PRINT_ERROR("1-error");
lseek(fd1,i,SEEK_SET);
//write写入数据
int i=size/2;
unsigned char str1[i];
ssize_t a=read(fd,str1,i);
printf("a=%ld\n",a);
ssize_t res=write(fd1,str1,sizeof(str1));
if(res==-1)
PRINT_ERROR("write error");
printf("res=%ld\n",res);
exit(1);
lseek(fd1,0,SEEK_SET);
close(fd1);
}
//创建失败
else
PRINT_ERROR("fork");
//关闭图片
close(fd);
return 0;
}