1.
用文件
IO
拷贝一张图片,要求子进程先拷贝后半部分,父进程后拷贝前半部分。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, const char *argv[])
{
int fd_r = open("./1.bmp",O_RDONLY);
if(fd_r <0)
{
perror("open");
return -1;
}
int fd_w = open("copy.bmp",O_WRONLY|O_CREAT|O_TRUNC,0777);
if(fd_w < 0)
{
perror("open");
return -1;
}
off_t size = lseek(fd_r,0,SEEK_END);
printf("size=%ld\n",size);
//创建子进程
pid_t pid = fork();
if(pid > 0)
{
sleep(2);
//父进程执行,拷贝前半部分,所以要偏移到开头位置
lseek(fd_r,0,SEEK_SET);
lseek(fd_w,0,SEEK_SET);
char c = 0;
int i = 0;
for(i=0;i<size/2;i++)
{
read(fd_r,&c,1);
write(fd_w,&c,1);
}
printf("文件前半部分拷贝完毕\n"):
}
else if(pid == 0)
{
//子进程执行,拷贝后半部分,所以要偏移到中间位置
lseek(fd_r,size/2,SEEK_SET);
lseek(fd_w,size/2,SEEK_SET);
char c = 0;
int i = 0;
for(i=size/2;i<size;i++)
{
read(fd_r,&c,1);
write(fd_w,&c,1);
}
printf("文件后半部分拷贝完毕\n");
}
else if(pid < 0)
{
perror("fork");
return -1;
}
close(fd_w);
close(fd_r);
return 0;
}
2.
用文件
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;
}