IO进程——父子进程、孤儿进程、僵尸进程

该博客涵盖了多个Linux进程操作的实例,包括使用父子进程协同拷贝文件,其中子进程拷贝后半部分,父进程拷贝前半部分。同时,介绍了如何创建孤儿进程和僵尸进程。最后,展示了如何通过C语言程序打印指定目录下所有文件的详细信息,如文件类型、权限、大小和修改时间等。
摘要由CSDN通过智能技术生成
1. 要求用父子进程拷贝一张图片,其中子进程先拷贝后半部分,父进程后拷贝前半部分。要求
用文件 IO 实现。
可以使用 sleep() 函数 wait
#include <stdio.h>
#include <string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<error.h>

int main(int argc, const char *argv[])
{
	int fd_r = open("./2.jpg",O_RDONLY);
	if(fd_r<0)
	{
		perror("openr");
		return -1;
	}
/*	int fd_w = open("./21.jpg",O_WRONLY|O_CREAT|O_TRUNC,0664);
	if(fd_w < 0);
	{
	
		perror("openw");
	//	return -1;
	}*/
	pid_t pid = fork();
	off_t size = lseek(fd_r,0,SEEK_END);

	ssize_t res=0;
	if(pid>0)
	{
		printf("父");
		int fd_w = open("./21.jpg",O_WRONLY|O_CREAT|O_TRUNC,0664);
		if(fd_w < 0);
		{

			perror("openw");
			//	return -1;
		}
		sleep(1);
		lseek(fd_r,0,SEEK_SET);
		lseek(fd_w,0,SEEK_SET);
		for(int i=0;i<size/2;i++)
		{
			char buf;
			res = read(fd_r,&buf,1);
			if(res<0)
			{
				perror("read");
				return -1;
			}
			else if(0==res)
			{
				break;
			}
			if(write(fd_w,&buf,res)<0)
			{
				perror("write");
				return -1;
			}

		}
		close(fd_w);
	}
	else if(0==pid)
	{
		int fd_w = open("./22.jpg",O_WRONLY|O_CREAT|O_TRUNC,0664);
		if(fd_w < 0);
		{

			perror("openw");
			//	return -1;
		}
		lseek(fd_r,-size/2,SEEK_END);
		lseek(fd_w,-size/2,SEEK_END);
		char buf;
		res = read(fd_r,&buf,1);
		printf("子");
		for(int i=0;i<size/2;i++)
		{
			if(res<0)
			{
				perror("read");
				return -1;
			}
			else if(0==res)
			{
				break;
			}
			if(write(fd_w,&buf,res)<0)
			{
				perror("write");
				return -1;
			}
		}
		
	close(fd_w);
	}
	else 
	{
		perror("fork");
		return -1;
	}
	printf("图片复制成功\n");
	close(fd_r);
//	close(fd_w);
	return 0;
}

功能测试

2. 创建孤儿进程,创建僵尸进程:
孤儿进程:父进程退出,子进程死循环换
僵尸进程:子进程退出,父进程死循环。
孤儿进程:
  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <unistd.h>
  4 int main(int argc, const char *argv[])
  5 {
  6     if(fork() == 0)
  7     {
  8         while(1)
  9         {
 10             printf("child\n");
 11             sleep(1);
 12         }
 13     }
 14     return 0;
 15 }                                                                                    
~               

 僵尸进程

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <unistd.h>
  4  
  5 int main(int argc, const char *argv[])
  6 {
  7     //创建子进程
  8     
  9     if (fork() > 0)
 10     {
 11         printf(" parent\n");
 12         while (1)
 13         {
 14             printf("parent -------\n");
 15             sleep(1);
 16         }   
 17     }   
 18     else if(0 == fork())
 19     {
 20         printf("child\n");
 21         
 22     }   
 23     else
 24     {                                                                                
 25         perror("fork");
 26         return -1;
 27     }   
 28     return 0;
 29 }   
 30 

3.要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls  -l
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<time.h>
#include<pwd.h>
#include<dirent.h>
#include<errno.h>
#include<grp.h>
 
char get_filetype(mode_t m)
{
    switch(m & S_IFMT){
    case S_IFSOCK:  printf("s"); break;
    case S_IFLNK:   printf("l"); break;
    case S_IFREG:   printf("-"); break;
    case S_IFBLK:   printf("b"); break;
    case S_IFDIR:   printf("d"); break;
    case S_IFCHR:   printf("c"); break;
    case S_IFIFO:   printf("p"); break;
    }   
    return 0;                                                                                                                                                                       
}

void modex(mode_t mode)
{
	int a=0400;
	int flag=0;
	while(a!=0)
	{
		if((mode&a)==0)
		{
			putchar('-');
		}
		else
		{
			switch(flag%3)
			{
			case 0:putchar('r');break;
			case 1:putchar('w');break;
			case 2:putchar('x');break;
			}
		}
		a=a>>1;
		flag++;
	}
}
int main(int argc, const char *argv[])
{
	
    DIR *dp = opendir("./");
    if(NULL==dp)
    {
        perror("opendir");
        return -1;
    }
	struct dirent *rp;

	while(1)
	{
		rp = readdir(dp);

		if(NULL==rp)
		{
			if(0==errno)
			{
				break;
			}
			else
			{
				perror("readdir");
				return -1;
			}
		}
		
		//获取文件的所有属性
		struct stat buf;
		if(stat(rp->d_name,&buf)<0)
		{
			perror("stat");
			return -1;
		}
		//文件类型及文件权限        
		get_filetype(buf.st_mode);                                                                                                                                                  

		modex(buf.st_mode);
		printf(" %ld ",buf.st_nlink);

		struct passwd *pwd=getpwuid(getuid());
		struct group *grp = getgrgid(getgid());

		printf("%s %s ",pwd->pw_name,grp->gr_name);
		printf("%ld ",buf.st_size);
		struct tm* info = localtime(&buf.st_ctime);
		if(NULL==info)
		{
			perror("localtime");
			return -2;
		}
		printf("%d月    %d %d:%d ",info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min);
	
		printf("%s\n",rp->d_name);
		printf("\n");
	}

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值