9.2作业

1.  要求用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分。要求用文件IO实现。

可以使用sleep()函数    wait

#include <stdio.h>   
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/wait.h>


int main(int argc, const char *argv[])
{

	// 要求用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分
	// 要求用文件IO实现。
	
	// 本人只能使用wait函数
	
	//以读的方式打开源文件
	int fd_r=open("./1.jpg",O_RDONLY);

	
	//修改文件权限掩码
	umask(0);
	
	//以写的方式打开目标文件
	int fd_w=open("./copy.jpg",O_WRONLY |O_CREAT |O_TRUNC,0664);
	
	//计算文件的大小:
	off_t size =lseek(fd_r,0,SEEK_END);
	printf("size =%ld\n",size);

	pid_t pid = fork();
	if( pid >0 )
	{
		//方法一:
		pid_t pd=wait(NULL);

		if(pd <0)
		{
			perror("wait");
			return -1;
		}
		
		//方法二:
		//sleep(3);

		//拷贝前半部分
	
		if( fd_r <0 )
		{
			perror("open");
			return -1;
		}


		//修改文件偏移量
		lseek(fd_r,0,SEEK_SET);
		lseek(fd_w,0,SEEK_SET);

	
		//开始拷贝
		int i=0;
		char ch;

		//读一次写一次;
		for(i=0; i<size/2; i++)
		{
		    ssize_t res=read(fd_r,&ch,1);
		
			if(res<=0)
			{
				perror("read");
				return -1;
			}

			ssize_t ret=write(fd_w,&ch,1);

			if( res <0 )
			{
				perror("write");
				return -2;
			}
		}
	}


	else if( pid == 0 )
	{
		//拷贝后面半部分

		//修改文件偏移量
		lseek(fd_r,size/2,SEEK_SET);
		lseek(fd_w,size/2,SEEK_SET);

		//读一次写一次;
		int i=0;
		char ch;
		for(i=size/2; i<size; i++)
		{
			ssize_t res=read(fd_r,&ch,1);
			
			if(res<=0)
			{
				perror("read");
				return -1;
			}

			ssize_t ret=write(fd_w,&ch,1);

			if( ret <0 )
			{
				perror("write");
				return -2;
			}
		}

	}

	else
	{
		perror("fork");
	}

	//关闭文件
	close(fd_r);
	close(fd_w);

	return 0;
}

效果图:

 

2. 创建孤儿进程,创建僵尸进程:
   孤儿进程:父进程退出,子进程死循环

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>


int main(int argc, const char *argv[])
{
	//创建孤儿进程
	//顾名思义:就是没有父子进程的进程

	//创建子进程;
	pid_t pid=fork();

	while(1)
	{
		sleep(1);


		//分支结构判断
		if( pid >0)
		{
			//父进程执行,让父进程提前退出
			exit(0);
		}

		else if( pid == 0)
		{
			printf("chilren pid:%d\n",pid);
		}

		else if(pid <0)
		{
			perror("fork\n");
		}

	}

    fcolse("pid");
	return 0;
}

效果图:

僵尸进程:子进程退出,父进程死循环

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>


int main(int argc, const char *argv[])
{
	//创建僵尸进程
	//顾名思义:就是没有子进程的退出,没有回收子进程的资源

	//创建子进程;
	pid_t pid=fork();

	while(1)
	{
		sleep(1);


		//分支结构判断
		if( pid >0)
		{
			printf("pid:%d\n",pid);
		}

		else if( pid == 0)
		{

			//子进程执行,让子进程提前退出
			exit(0);
		}

		else if(pid <0)
		{
			perror("fork\n");
		}

	}
	return 0;
}

效果图:

3. 要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l


int main(int argc, const char *argv[])
{


	//打开目录
	if( argc != 2)
	{
		printf("error,请输入文件名:");
		printf("\n");
		return -1;
	}

	DIR * fp_r =opendir(argv[1]);
	if( NULL == fp_r)
	{
		perror("opendir");
		return -1;
	}

	//printf("opendir success\n");
	
	struct stat p;
	//printf("%s\n",argv[1]);
	
	/*
	char arr[128]="";
	strcpy(arr,argv[1]);
	printf("%s\n",arr);
	*/

	//读取目录
	while(1)
	{
		struct dirent *fd=readdir(fp_r);
		if(NULL == fd)
		{

			if(0 == error)
			{
				printf("目录读取完毕\n");
				break;
			}
			else
			{
				//perror("readdir");
				return -1;
			}
		}
		if('.' == fd->d_name[0])
		{
			continue;
		}

			
	char arr[128]="";
	strcpy(arr,argv[1]);
	strcat(arr,fd->d_name);
	//printf("%s ",fd->d_name);
	//printf("\n");


	

	FILE * fp=fopen("argv[1]","r");
	
	
	if (stat(arr,&p)<0)
	{ 
		perror("stat");
		return -1;
	}

	//获取文件的权限
	get_filetype(p.st_mode);//获取文件类型
	get_permission(p.st_mode);//获取文件的权限


	
	//获取文件的硬链接数
	printf("  %ld",p.st_nlink);

	//获取文件的用户id
	//printf("  %d",p.st_uid);
 	get_fileuid_number(p.st_uid);

	//获取文件的组id
	//printf("  %d",p.st_gid);
 	//struct group* pg= getgrgid(p.st_uid);
	get_filegid_number(p.st_gid);
	
	//获取文件的大小
	printf("  %ld",p.st_size);
	
	//获取文件的创建时间
	struct tm * info;
	info=localtime(&p.st_mtime);

	/*
	time_t t;
	t=time(&t);
	struct tm * info;
	info=localtime(&t);
	*/
	printf("%2d月 %2d %02d:%02d",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min);

	//获取文件名
	printf(" %s\n", fd->d_name);
	}

	//关闭目录
	closedir(fp_r);

	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值