要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <string.h>
#include <dirent.h>
#include <errno.h>
#include <time.h>
char file_type(mode_t m);
char *file_permission(mode_t m,char *str);
char *file_uid(uid_t uid,char *str);
char *file_gid(gid_t gid,char *str);
void file_time(time_t time);
int main(int argc, const char *argv[])
{
DIR *dp=opendir(argv[1]);
if(dp==NULL)
{
perror("opendir");
return -1;
}
char ch=0;
char str[20]="";
struct stat buf;
char path_name[50]="";
while(1)
{
struct dirent *pa=readdir(dp);
if(pa==NULL)
{
if(errno==0)
{
printf("read over\n");
break;
}
else
{
perror("readdir");
return -1;
}
}
if(*pa->d_name!='.')
{
//printf("%s\n",pa->d_name);
strcpy(path_name,argv[1]);
strcat(path_name,pa->d_name);
if(stat(path_name,&buf)<0)
{
perror("stat");
return -1;
}
//提取文件类型
ch=file_type(buf.st_mode);
putchar(ch);
//提取文件权限
file_permission(buf.st_mode,str);
printf("%s ",str);
//提取链接数
printf("%2ld ",buf.st_nlink);
//提取所属用户ID uid_t st_uid
file_uid(buf.st_uid,str);
printf("%s ",str);
//提取所属组用户ID gid_t st_gid
file_gid(buf.st_gid,str);
printf("%s ",str);
//提取文件大小 off_t st_size
printf("%7ld ",buf.st_size);
//提取文件时间 st_atime
file_time((time_t)buf.st_mtime);
printf("%s\n",pa->d_name);
}
}
closedir(dp);
return 0;
}
char file_type(mode_t m)
{
char ch;
switch(m&S_IFMT)
{
case S_IFBLK:ch='b';break;
case S_IFCHR:ch='c';break;
case S_IFDIR:ch='d';break;
case S_IFREG:ch='-';break;
case S_IFLNK:ch='l';break;
case S_IFSOCK:ch='s';break;
case S_IFIFO:ch='p';break;
}
return ch;
}
char *file_permission(mode_t m,char *str)
{
for(int i=0;i<9;i++)
{
if(m&(0400>>i))
{
switch(i%3)
{
case 0:str[i]='r';break;
case 1:str[i]='w';break;
default:str[i]='x';
}
}
else
{
str[i]='-';
}
}
return str;
}
char *file_uid(uid_t uid,char *str)
{
struct passwd *pa=getpwuid(uid);
if(pa==NULL)
{
perror("getpwuid");
return NULL;
}
strcpy(str,pa->pw_name);
return str;
}
char *file_gid(gid_t gid,char *str)
{
struct group *pa=getgrgid(gid);
if(pa==NULL)
{
perror("getgrgid");
return NULL;
}
strcpy(str,pa->gr_name);
return str;
}
void file_time(time_t time)
{
struct tm *pa=localtime(&time);
printf("%02d %02d %02d:%02d ",pa->tm_mon+1,pa->tm_mday,\
pa->tm_hour,pa->tm_min);
}
创建一个孤儿进程,创建一个僵尸进程;
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
pid_t pid=fork();
if(pid>0)
{
printf("father\n");
printf("getppid=%d getpid=%d\n",getppid(),getpid());
_exit(7);//孤儿进程
while(1)
sleep(1);
}
else if(pid==0)
{
printf("child\n");
printf("getppid=%d getpid=%d\n",getppid(),getpid());
//_exit(7);//僵尸进程
while(1)
sleep(1);
}
else
{
perror("fork");
return -1;
}
return 0;
}