1> 使用父子进程完成两个文件的拷贝
父进程拷贝前一半内容,子进程拷贝后一半内容
子进程结束后退出,父进程回收子进程的资源
#include<myhead.h>
int main(int argc, const char *argv[])
{
//判断传入的文件个数
if (argc != 3) {
perror("file error");
return -1;
}
//以只读的形式打开源文件
int srcfd=open(argv[1],O_RDONLY);
if(srcfd==-1)
{
perror("open srcfile error");
return -1;
}
//以只写的形式打开目标文件
int destfd=dup(srcfd);
destfd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);
if(destfd==-1)
{
perror("open destfile error");
return -1;
}
char buf[128]="";
int res=0;
int sum = 0;
//循环统计字节总数
while(1)
{
res=read(srcfd,buf,sizeof(buf));
sum+=res;
if(res==0)
{
break;
}
}
//定义进程号
pid_t pid =fork();
if(pid==-1)
{
perror("fork error");
return -1;
}
if (pid > 0)
{
// 父进程拷贝前一半内容
lseek(srcfd, 0, SEEK_SET);
int half = sum / 2; //文件一半
int num=0;
while (num<half)
{
read(srcfd, buf,1);
if (res == 0)
{
break;
}
write(destfd, buf,1);
num++;
}
}
else
{
// 子进程拷贝后一半内容
int half = 0;
lseek(srcfd, half, SEEK_SET); // 移动到文件的中间位置
while (1)
{
res = read(srcfd, buf, sizeof(buf));
if (res == 0)
{
break;
}
write(destfd, buf, res);
}
exit(0); // 子进程退出
}
//回收子进程资源
wait(NULL);
close(destfd);
close(srcfd);
return 0;
}
2> 将多进程的程序自己实现一遍
#include<myhead.h>
int main(int argc, const char *argv[])
{
//定义进程号
pid_t pid = fork(); //创建一个子进程
//判断父子进程
if(pid > 0)
{
printf("我是父进程:pid = %d, 当前进程的id为:%d,当前进程的父进程的id为:%d\n",\
pid, getpid(), getppid());
}else if(pid == 0)
{
printf("我是子进程:pid = %d,当前进程的pid为:%d, 当前进程的父进程pid为:%d\n",\
pid, getpid(), getppid());
sleep(3); //休眠3秒
//退出子进程
//exit(EXIT_SUCCESS); //exit(0);
_exit(EXIT_SUCCESS); //exit(0);
}else
{
perror("fork error");
return -1;
}
//回收子进程资源
//wait(NULL);
//waitpid(-1, NULL, 0); //阻塞回收
sleep(5);
waitpid(-1, NULL, WNOHANG); //非阻塞回收
printf("回收子进程资源结束\n");
while(1);
return 0;
}
3> 详细绘制思维导图