作业1:从终端获取一个文件的路径以及名字
- 若该文件是目录文件,则将该文件下的所有文件的属性显示到终端,类似ls -l该文件夹
- 若该文件不是目录文件,则显示该文件的属性到终端上,类似ls -l这单个文件
以下代码只能跑本目录下的:
#include <stdio.h>
#include <head.h>
#include <sys/types.h>
#include <errno.h>
#include <dirent.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
void get_filePermission(mode_t m)
{
char buf[]="rwx";
for(int i=0;i<9;i++)
{
if( (m & (0400)>>i) == 0)
{
putchar('-');
continue;
}
printf("%c",buf[i%3]);
}
putchar(' ');
}
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');
else if(S_ISBLK(m))
putchar('b');
else if(S_ISFIFO(m))
putchar('p');
else if(S_ISLNK(m))
putchar('l');
else if(S_ISSOCK(m))
putchar('s');
}
int File_properties(char *file_name)
{
struct stat buf;
if(stat(file_name,&buf) < 0 )
{
ERR_MSG("stat");
return -1;
}
//文件的类型和权限
get_fileType(buf.st_mode);
get_filePermission(buf.st_mode);
//文件的所属用户
struct passwd* pwd=getpwuid(buf.st_uid);
if(NULL == pwd)
{
ERR_MSG("getpwuid");
return -1;
}
//文件所属组用户
struct group* grp=getgrgid(buf.st_gid);
if(NULL == grp)
{
ERR_MSG("getgrgid");
return -1;
}
//时间
struct tm* info=NULL;
info=localtime(&buf.st_mtime);
printf("%ld %s %s %ld %d月 %d %02d:%02d %s\n", buf.st_nlink, pwd->pw_name, grp->gr_name, buf.st_size, info->tm_mon+1, info->tm_mday, info->tm_hour, info->tm_min, file_name);
return 0;
}
int main(int argc, const char *argv[])
{
//从终端获取一个文件的路径及名字
//若该文件是目录文件,则将该文件下的所有文件的属性显示到终端,类似ls -l该文件夹
//若该文件不是目录文件,则显示该文件的属性到终端上,类似ls -l这单个文件
//输入文件路径及名字
char file_name[50]="";
printf("请输入一个文件的路径以及名字:");
scanf("%s",file_name);
struct stat buf;
//打开这个文件
if( stat(file_name, &buf) < 0)
{
ERR_MSG("stat");
return -1;
}
printf("打开成功\n");
//判断这个是不是目录文件
if( (buf.st_mode & S_IFMT) == S_IFDIR )
{
DIR* dp=opendir(file_name);
if(NULL == dp)
{
ERR_MSG("opendir");
return -1;
}
printf("opendir success\n");
int i=0;
while(1)
{
struct dirent* rp= readdir(dp);
if(NULL == rp)
{
if(0 == errno)
{
printf("目录读取完毕\n");
break;
}
else
{
ERR_MSG("readdir");
return -1;
}
}
if(rp->d_name[0] != '.')
{
//printf("[%d]%s\n", ++i, rp->d_name);
File_properties(rp->d_name);
}
}
if( closedir(dp) < 0)
{
ERR_MSG("closedir");
return -1;
}
}
else
{
//不是目录文件
File_properties(file_name);
}
return 0;
}
作业2:文件IO函数实现,拷贝文件
子进程先拷贝后半部分,父进程再拷贝前半部分。允许使用sleep函数
#include <stdio.h>
#include <head.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
//文件IO函数实现,拷贝文件
//子进程先拷贝后半部分,父进程再拷贝前半部分。允许使用sleep函数
umask(0);//将本程序的umake的值改为0
int fd = open("./01_fork.c", O_RDONLY);
if(fd <0)
{
ERR_MSG("open");
return -1;
}
printf("open fd success\n");
off_t size = lseek(fd, 0, SEEK_END);
printf("size=%ld\n",size);
printf("__%d__\n",__LINE__);
//创建一个子进程
pid_t cpid =fork();
//在fork以下的这段代码,父子进程均运行
if(cpid > 0)//在父进程中,该条件为真
{
sleep(1);
lseek(fd,size/2,SEEK_SET);
char b=0;
for(int i=size/2;i<size;i++)
{
if(0== read(fd,&b,1))
break;
printf("%c",b);
}
}
else if(0 == cpid)//在子进程中,该条件为真
{
lseek(fd,0,SEEK_SET);
char b=0;
for(int i=0;i<size/2;i++)
{
if(0 == read(fd,&b,1))
break;
printf("%c",b);
}
}
//关闭文件
if(close(fd) < 0)
{
ERR_MSG("close");
return -1;
}
//printf("关闭成功\n");
return 0;
}