思维导图

一、创建一个进程扇
代码
#include <25041head.h>
int main(int argc, const char *argv[])
{
pid_t pid;
for(int i=1;i<=4;i++)
{
pid=fork();
if(pid>0)
{
sleep(1);
}
if(pid==0)
{
printf("我是子进程%d:%d,父进程%d\n",i,getpid(),getppid());
sleep(1);
return 0;
}
if(pid==-1)
{
ERRLOG("fork error..");
}
}
return 0;
}
运行结果

二、创建一个进程链
代码
#include <25041head.h>
int main(int argc, const char *argv[])
{
for(int i=1;i<=10;i++)
{
pid_t pid=fork();
if(pid>0)
{
wait(NULL);
break;
}
if(pid==0)
{
printf("子进程%d:%d,父进程%d\n",i,getpid(),getppid());
sleep(1);
continue;
}
if(pid==-1)
{
ERRLOG("fork error..");
}
}
return 0;
}
运行结果

三、打印结果




四、实现文件的拷贝,父进程拷贝前一部分,子进程拷贝后一部分
代码
#include <25041head.h>
int main(int argc, const char *argv[])
{
int fd1=open("./my.bmp",O_RDONLY);
int fd2=open("./new.bmp",O_RDWR | O_TRUNC | O_CREAT,0777);
int size=(lseek(fd1,0,SEEK_END))/2;
lseek(fd1,0,SEEK_SET);
char buf[128]="";
int sum=0;
size_t res;
int r_size;
pid_t pid=fork();
if(pid>0)
{
while(1)
{
memset(buf,0,sizeof(buf));
//判断buf的大小是否比文件的一半剩余的小,小就修改要读取的字符数
if(size-sum<sizeof(buf)-1)
r_size=size-sum;
else
r_size=sizeof(buf)-1;
res = read(fd1, buf,r_size);
write(fd2,buf,res);
if(res==0)
break;
sum+=res;
if(sum>size)
break;
}
wait(NULL);
return 0;
}
if(pid==0)
{
sleep(1);
int fd2=open("./new.bmp",O_RDWR | O_CREAT | O_APPEND,0777);
lseek(fd1,size,SEEK_SET);
while(1)
{
memset(buf,0,sizeof(buf));
res=read(fd1,buf,sizeof(buf)-1);
if(res==0)
break;
if(res==-1)
{
ERRLOG("read error..");
}
if(-1==write(fd2,buf,res))
{
ERRLOG("write error..");
}
}
if(-1==close(fd2))
{
ERRLOG("close error..");
}
printf("文件拷贝成功\n");
exit(0);
}
return 0;
}
运行结果

