1.使用文件IO函数,拷贝一张图片,父进程拷贝前半部分,子进程拷贝后半部分。不能使用sleep函数.
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/wait.h>
int main(int argc, const char *argv[])
{
umask(0);
int fd =open("./4.png",O_RDONLY);
if(fd<0)
{
perror("open");
return -1;
}
printf("open success fd =%d\n",fd);
int fd2 =open("copy.png",O_RDWR|O_CREAT|O_APPEND,0664);
if(fd2<0)
{
perror("open");
return -1;
}
ssize_t res = 0;
char buf[4]="";
pid_t ppid =fork();
//父进程打印后一半
if(ppid>0)
{
pid_t pidd=wait(NULL);
if(ppid<0)
{
perror("wait");
}
off_t res =lseek(fd2,0,SEEK_CUR);
off_t ret =lseek(fd,0,SEEK_CUR);
printf("%ld\n",res);
printf("%ld\n",ret);
while(1)
{
bzero(buf,sizeof(buf));
res =read(fd,buf,sizeof(buf));
if(0==res)
{
break;
}
write(fd2,buf,res);
}
}
//子进程打印前一半
else if(0 == ppid)
{
for(int i=0;i<21521;i++)
{
bzero(buf,sizeof(buf));
res = read(fd,buf,sizeof(buf));
write(fd2,buf,res);
}
}
exit(0);
return 0;
}
结果:
2.验证waitpid非阻塞态形式时,若子进程没退出,则子进程会不会变成僵尸进程
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
pid_t pidd = fork();
if(pidd>0)
{
pid_t res = waitpid(pidd,NULL,WNOHANG);
printf("this is parent:%d\n",getpid());
}
else if(pidd == 0)
{
sleep(3);
while(1)
{
sleep(1);
printf("this is child: %d\n",getpid());
}
}
while(1);
return 0;
}
结果
不会变成僵尸进程
3.创建僵尸进程
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
pid_t pidd = fork();
if(pidd>0)
{
pid_t res = waitpid(pidd,NULL,WNOHANG);
printf("this is parent:%d\n",getpid());
}
else if(pidd == 0)
{
sleep(3);
while(1)
{
sleep(1);
printf("this is child: %d\n",getpid());
exit(0);
}
}
while(1);
return 0;
}
先让父进程结束收尸,然后结束子进程这个时候子进程就会变成僵尸状态
结果:
4.创建孤儿进程
退出父进程不结束子进程这个时候就是孤儿进程
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<sys/wait.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
pid_t pidd = fork();
if(pidd>0)
{
pid_t res = waitpid(pidd,NULL,WNOHANG);
printf("this is parent:%d\n",getpid());
exit(0);
}
else if(pidd == 0)
{
sleep(3);
while(1)
{
sleep(1);
printf("this is child: %d\n",getpid());
}
}
return 0;
}
结果: