IOday5作业

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

 

结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值