20230224 作业

作业:

外部输入一个路径,要求显示该路径下,所有文件的详细信息,除了隐藏文件。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>

char *mon[12]={"一月","二月","三月","四月","五月","六月","七月"\
	,"八月","九月","十月","十一月","十二月"};

char get_file_type1(mode_t mode){
	if(S_ISREG(mode))
		return '-';
	else if(S_ISDIR(mode))
		return 'd';
	else if(S_ISCHR(mode))
		return 'c';
	else if(S_ISBLK(mode))
		return 'b';
	else if(S_ISFIFO(mode))
		return 'p';
	else if(S_ISLNK(mode))
		return 'l';
	else if(S_ISSOCK(mode))
		return 's';
}
char *get_file_permission(mode_t mode){
	char *str=malloc(10);
	int rwx = 0400;
	char per[]="rwx";
	int i=0;
	for(;i<9;i++){
		if(mode & rwx>>(i)){
			*(str+i) = per[i%3];
		}else{
			*(str+i) = '-';
		}
	}
	*(str+i) = '\0';
	return str;
}
char *get_user_name(uid_t uid){
	struct passwd *_passwd=getpwuid(uid);
	if(_passwd != NULL)
		return _passwd->pw_name;
	else{
		perror("getpwuid");
		return "";
	}
}

char *get_group_name(gid_t gid){
	struct group *_group=getgrgid(gid);
	if(_group != NULL)
		return _group->gr_name;
	else{
		perror("getgrgid");
		return "";
	}
}

void get_file_content(const char *path,const char *filename){
	char *file = malloc(strlen(path)+1+strlen(filename)+1);
	sprintf(file,"%s/%s",path,filename);

	struct stat buf;
	if(stat(file,&buf) >= 0){
		struct tm *info = localtime(&buf.st_ctime);
		printf("%c%s %lu %s %s %5ld %s %02d %02d:%02d %s\n",\
			get_file_type1(buf.st_mode),\
			get_file_permission(buf.st_mode),\
			buf.st_nlink,\
			get_user_name(buf.st_uid),\
			get_group_name(buf.st_gid),\
			buf.st_size,\
			mon[info->tm_mon],info->tm_mday,info->tm_hour,info->tm_min,filename);
	}else{
		printf("read file(%s) failed \n",file);
	}

	free(file);
	file = NULL;
}

int main(int argc, const char *argv[])
{
	if(argc < 2)
	{
		printf("请输入目录名称\n");
		return -1;
	}
	const char *dirName = argv[1];

	DIR *dir = opendir(dirName);
	if(NULL == dir){
		perror("opendir");
		return -1;
	}
	while(1){
		struct dirent *rdir = readdir(dir);
		if(NULL == rdir){
			if(0 != errno){
				perror("readdir");
				return -1;
			}else{
				break;
			}
		}
		//printf("%s\n",rdir->d_name);
		if('.' != rdir->d_name[0])
			get_file_content(dirName,rdir->d_name);
	}

	if(closedir(dir)<0){
		perror("closedir");
		return -1;
	}
	return 0;
}

执行结果:

ubuntu@ubuntu:20230224$ ./a.out dir
-rw-rw-r-- 1 ubuntu ubuntu     4 二月 24 11:42 1.txt
drwxrwxr-x 2 ubuntu ubuntu  4096 二月 24 11:20 1
-rw-rw-r-- 1 ubuntu ubuntu     6 二月 24 11:42 2.txt
drwxrwxr-x 2 ubuntu ubuntu  4096 二月 24 11:20 2
ubuntu@ubuntu:20230224$ ls dir -lh
总用量 16K
drwxrwxr-x 2 ubuntu ubuntu 4.0K 二月 24 11:20 1
-rw-rw-r-- 1 ubuntu ubuntu    4 二月 24 11:42 1.txt
drwxrwxr-x 2 ubuntu ubuntu 4.0K 二月 24 11:20 2
-rw-rw-r-- 1 ubuntu ubuntu    6 二月 24 11:42 2.txt

2 孤儿进程:没有父进程的进程,父进程退出,子进程不退出。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
	pid_t fk = fork();
	if(fk < 0){
		perror("fork");
	}
	if(fk == 0){
		while(1){
			sleep(1);
		}
	}

	return 0;
}

输出结果:

ubuntu@ubuntu:20230224$ ps -ajx | grep "a.out"
     1   4578   4577   4465 pts/2      4465 S     1000   0:00 ./a.out

3 僵尸进程:父进程不退出,子进程退出。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
	pid_t fk = fork();
	if(fk < 0){
		perror("fork");
	}
	if(fk != 0){
		while(1){
			sleep(1);
		}
	}

	return 0;
}

输出结果:

ubuntu@ubuntu:20230224$ ps -ajx | grep "a.out"
  4465   4591   4591   4465 pts/2      4591 S+    1000   0:00 ./a.out
  4591   4592   4591   4465 pts/2      4591 Z+    1000   0:00 [a.out] <defunct>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值