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;
}