用文件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;
}