作业1 使用文件IO完成对图像的读写操作
#include <head.h>
int main(int argc, const char *argv[])
{
int fd = -1;
if((fd=open(argv[1],O_RDONLY)) == -1)
{
perror("open error");
return -1;
}
int wd = -1;
if((wd=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664)) == -1)
{
perror("open_w error");
return -1;
}
char wbuf[128] = "";
while(1)
{
int res = read(fd, wbuf, sizeof(wbuf)); //定义res接受read读到的实际的数
if(res == 0)
break;
write(wd, wbuf, res);
}
printf("拷贝完成\n");
close(fd);
close(wd);
return 0;
}
作业2 使用stat函数实现ls -l指令
#include <head.h>
int main(int argc, const char *argv[])
{
//定义目录指针
DIR *dp = NULL;
//打开目录
if((dp=opendir("./"))==NULL)
{
perror("opendir error");
return -1;
}
//定义一个文件指针,用于存储读取的文件信息
struct dirent * rp = NULL;
while((rp = readdir(dp)) != NULL)
{
//定义文件状态结构体变量,用于返回文件信息
struct stat st;
if(stat(rp->d_name,&st) == -1)
{
perror("stat error");
}
//如果程序执行到此,说明st中已经存放了制定文件的信息
switch(st.st_mode&S_IFMT)
{
case S_IFSOCK:
printf("s "); //套接字文件
break;
case S_IFLNK:
printf("l "); //链接文件
break;
case S_IFREG:
printf("- "); //普通文件
break;
case S_IFBLK:
printf("b "); //块设备文件
break;
case S_IFDIR:
printf("d "); //目录文件
break;
case S_IFCHR:
printf("c "); //字符设备文件
break;
case S_IFIFO:
printf("p "); //管道文件
break;
}
//文件的权限
printf("%#o ",st.st_mode&0777);
//文件的硬链接数
printf("%ld ",st.st_nlink);
//文件的id号
//将uid转换成名字
struct passwd* pwd = getpwuid(st.st_uid);
if(NULL==pwd)
{
perror("getpwuid");
return -1;
}
printf("%s ",pwd->pw_name);
//文件的所属组用户
//讲gid转换成名字
struct group* grp = getgrgid(st.st_gid);
if(NULL == grp)
{
perror("getgrgid");
return -1;
}
printf("%s ",grp->gr_name);
//文件大小
printf("%10ld ",st.st_size);
//文件的修改时间
struct tm *tp = localtime(&st.st_ctime);
printf("%4d-%02d-%02d %02d:%02d:%02d\t",\
tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday,\
tp->tm_hour, tp->tm_min, tp->tm_sec);
//文件名
printf("%s\n",rp->d_name);
}
closedir(dp);
return 0;
}
效果如下