fork概念和文件属性

本文讨论了在Linux中fork操作对父子进程内存的影响,指出虚拟地址在父子进程中相同但物理地址不同。同时,展示了如何在C语言中实现ls-l命令,列出文件的详细信息,包括权限、类型、所有者、组、大小和修改时间。
摘要由CSDN通过智能技术生成

任务1:fork前创建一个int a,父子进程中是否都有变量a,虚拟地址是否相同,物理地址是否相同

答:虚拟地址相同,但物理地址不相同。子进程是直接复制父进程的所有资源,用户空间的虚拟地址也是相同,但因为是进程,所以用户空间独立,物理空间随机映射,所以不相同。


任务2:fork函数后,在父进程中int b,父子进程中是否都有变量b,虚拟地址是否相同,物理地址是否相同

答:子进程根本找不到定义的变量,因为进程之间相互独立。

任务3:fork函数后,在子进程中int c,父子进程中是否都有变量c,虚拟地址是否相同,物理地址是否相同

答:父进程根本找不到定义的变量,因为进程之间相互独立。


作业4:完成ls -l

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <dirent.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <strings.h>
 
char* get_filePermission(mode_t m)
{
	static char getPer[10]="";
	char per[]="rwx";
	
	for(int i=0;i<=8;i++)
	{
		if((m&(0400>>i))==0)
		{
			getPer[i]='-';
			continue;
		}
		getPer[i]=per[i%3];
	
	}
 	return getPer;
}
void get_fileType(mode_t m)
{
	if(S_ISREG(m))
	{
		putchar('-');
	}
	else if(S_ISDIR(m))
	{
		putchar('d');
	}
	else if(S_ISCHR(m))
	{
		putchar('c');
	}
	return;
}
int main(int argc, const char *argv[])
{
 DIR *dp = opendir(argv[1]);
	
    if(NULL == dp)
    {
        perror("opendir");
        return -1;
    }
 
    int count = 1;
    struct dirent* rp = NULL;
	int fd;
	struct stat buf;
	struct tm* info=NULL;
	time_t t;
	char str[30]="";
	
    while(1)
    {
        rp = readdir(dp);
        if(NULL == rp)
        {
            if(0 == errno)
            {
				printf("目录文件读取完毕\n");
				break;                             
			}
			else
			{
				perror("readdir");
				return -1;
			}
		}
		if((rp->d_name)[0]=='.')
		{
			continue;
		}
		strcpy(str,argv[1]);
	
		strcat(str,rp->d_name);
		if(stat(str,&buf)<0)
		{
			perror("stat");
			return -1;
		}
		struct passwd* pwd =getpwuid(buf.st_uid);
		struct group* grp =getgrgid(buf.st_gid);
		//t=time(NULL);
		info=localtime(&buf.st_ctime);
		if(NULL==info)
		{
			perror("localtime");
		}
		get_fileType(buf.st_mode); 
		printf("%s ",get_filePermission(buf.st_mode));
		printf(" %ld ",buf.st_nlink);
		printf(" %s ",pwd->pw_name);
		printf(" %s ",grp->gr_name);
		printf(" %ld  ",buf.st_size);
		printf("%d-%02d-%02d %02d:%02d:%02d  ",info->tm_year+1900,info->tm_mon+1,info->tm_mday,info->tm_hour,info->tm_min,info->tm_sec);

		printf(" %s\n", rp->d_name);
	}
	return 0;
}

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值