进程状态间的转化
创建出三个进程完成两个文件之间拷贝工作,子进程1拷贝前一半内容,子进程2拷贝后一半内容,父进程回收子进程的资源
#include <head.h>
int main(int argc, const char *argv[])
{
FILE *fp1=NULL,*fp2=NULL;//定义两个文件指针用于读写
if((fp1=fopen(argv[1],"r"))==NULL)
{
perror("");
return -1;
}
if((fp2=fopen(argv[2],"w"))==NULL)
{
perror("");
return -1;
}
fseek(fp1,0,SEEK_END);
int size=ftell(fp1);
fseek(fp1,0,SEEK_SET);
//定义父进程
pid_t father=-1;
father=fork();//使用父进程创建子进程
if(father==0)//判断是子进程1
{
pid_t child=fork();
if(child==0)//判断是子进程2
{
sleep(1);//等待子程序1拷贝上面一般的文件
char buf;
fseek(fp1,size/2,SEEK_SET);//手动光标后移
while(ftell(fp1)!=size)//当文件读写到最后时结束循环
{
fread(&buf,1,1,fp1);//读
fwrite(&buf,1,1,fp2);//写
}
exit(EXIT_SUCCESS);
}
else if(child>0)//子进程1
{
char buf;
while(ftell(fp1)<size/2)//读取文件一般大小就停止
{
fread(&buf,1,1,fp1);//读
fwrite(&buf,1,1,fp2);//写
}
exit(EXIT_SUCCESS);
}
}
else if(father>0)
{
wait(NULL);
wait(NULL);
}
fclose(fp1);
fclose(fp2);
return 0;
}
ubuntu@ubuntu:day4$ clear
ubuntu@ubuntu:day4$ gcc h1.c
ubuntu@ubuntu:day4$ ls
1.c a.out fork.c h1.c
ubuntu@ubuntu:day4$ ./a.out fork.c 2.c
ubuntu@ubuntu:day4$ diff fork.c 2.c
ubuntu@ubuntu:day4$ ls -l
总用量 32
-rw-rw-r-- 1 ubuntu ubuntu 10 一月 5 00:52 1.c
-rw-rw-r-- 1 ubuntu ubuntu 267 一月 5 00:56 2.c
-rwxrwxr-x 1 ubuntu ubuntu 12880 一月 5 00:56 a.out
-rw-rw-r-- 1 ubuntu ubuntu 267 一月 4 14:23 fork.c
-rw-rw-r-- 1 ubuntu ubuntu 1112 一月 5 00:56 h1.c
ubuntu@ubuntu:day4$