作业:
外部输入一个路径,要求显示该路径下,所有文件的详细信息,除了隐藏文件。
#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>