Linux 系统编程 --- day3
目录
1. fileno
2.fdopen
3. 目录操作
3.1 opendir
3.2 readdir
3.3 closedir
3.4 实现 ls 命令的功能
4. chdir (相当于cd命令)
5. getcwd (相当于pwd命令)
6. mkdir
7. rmdir (相当于rm命令)
8. stat
9. 关于时间的函数
9.1 time
9.2 localtime
9.3 ctime
10. uid 和 gid
10.1 getpwuid
10.2 getgrgid
1. fileno
int fileno(FILE *stream);
功能 : 获得一个文件流指针中的文件描述符
参数:
stream : 文件流指针
返回值 : 成功返回文件描述符,失败返回-1
2.fdopen
FILE *fdopen(int fd, const char *mode);
功能 : 将文件描述符转化为文件流指针
参数:
fd : 已经打开的文件描述符
mode:(拿到文件为什么模式就传什么模式,不能改权限)
"r"
"r+"
"w"
"w+"
"a"
"a+"
返回值 : 成功返回文件流指针,失败返回NULL
注:这两个函数的关闭要拿封装度搞得关文件,任何一个关掉后,另一个就不能再用了。
3. 目录操作
一般流程:
1、打开目标目录
2、读取目录,,
3、关闭目录
3.1 opendir
DIR *opendir(const char *name);
功能:打开一个目录获得一个目录流指针
参数:
name :目录名
返回值:成功返回目录流指针,失败返回NULL
3.2 readdir
struct dirent *readdir(DIR *dirp);
功能:从目录流中读取文件信息并将保存信息的结构体
参数:
dirp:目录流指针
返回值:包含文件信息的结构体,出错或者读到目录流末尾返回NULL
3.3 closedir
int closedir(DIR *dirp);
功能:关闭之前已经打开的目录流对象
参数:opendir的返回结果中目录流对象
返回值:成功 0,失败 -1;
3.4 实现 ls 命令的功能
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>int main(int argc, char *argv[])
{DIR * dir = opendir("./"); // 打开当前目录if(NULL == dir){fprintf(stderr,"opendir errpr\n");return 1;}while(1){struct dirent * info = readdir(dir); // 读取目录中的文件if(NULL == info){break;}switch(info->d_type) // 判断文件类型{case DT_DIR:printf("目录文件 ");break;case DT_REG:printf("普通文件 ");break;case DT_UNKNOWN:printf("其他文件 ");break;default:printf("未知文件 ");}printf("%s\n",info->d_name);}closedir(dir);return 0;
}
4. chdir (相当于cd命令)
int chdir(const char *path);
功能 :改变当前程序的工作路径
参数:
path:改变到的路径
返回值:成功返回0,失败返回-1
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{int ret = chdir("..");if(-1 == ret){fprintf(stderr,"chdir error\n");return 1;}return 0;
}
5. getcwd (相当于pwd命令)
char *getcwd(char *buf, size_t size);
功能:获得当前的工作路径
参数:
buf:保存工作路径空间的首地址
size:保存路径空间的长度(最大接收长度,如果没有这个buf可能越界)
返回值:成功返回包含路径空间的字符串首地址,失败返回NULL
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char *argv[])
{char buf[256]={0};getcwd(buf,sizeof(buf));printf("current path is %s\n",buf);chdir("../");getcwd(buf,sizeof(buf));printf("change path is %s\n",buf);return 0;
}
6. mkdir
int mkdir(const char *pathname, mode_t mode); // mode得写为0777
功能:创建一个目录
参数:
pathname:路径
mode:一般为0777,,
返回值:成功返回0,失败返回-1
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>int main(int argc, char *argv[])
{int ret = mkdir("aaa",0777);if(-1 == ret){fprintf(stderr,"mkdir error\n");return 1;}return 0;
}
7. rmdir (相当于rm命令)
int rmdir(const char *pathname);
int rmdir(const char *pathname);
功能:删除一个空目录文件
参数:
pathname:目录文件的名字
返回值:成功返回0,失败返回-1
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{int ret = rmdir("./aaa");if(-1 == ret){fprintf(stderr,"rmdir error\n");return 1;}return 0;
}
8. stat
int stat(const char *path, struct stat *buf);
功能:获得文件的属性
参数:
path :文件的路径
buf: 属性存放空间的首地址
返回值:成功返回0,失败返回-1
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>int main(int argc, char *argv[])
{struct stat st;char filename[]="./01ls.c";int ret= stat(filename,&st); if(-1 == ret){fprintf(stderr,"stat error\n");return 1;}printf("ino:%lu mode:%d link:%lu uid:%u gid:%u size:%lu time:%lu %s\n",st.st_ino,st.st_mode,st.st_nlink,st.st_uid,st.st_gid,st.st_size,st.st_mtime,filename);return 0;
}
9. 关于时间的函数
9.1 time
功能:获得1970年到现在的秒数
参数:
t:存放秒数的空间首地址
返回值:成功返回1970年到现在的秒数,失败返回-1
#include <time.h>
#include <stdio.h>
int main(int argc, char *argv[])
{time_t tm;time(&tm);printf("%ld\n",tm);return 0;
}
9.2 localtime
struct tm *localtime(const time_t *timep);
功能:将一个秒数转化成日历时间
参数:
timep:保存秒数空间的地址
返回值:成功返回保存日历时间结构体的指针,失败返回NULL
struct tm
{
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year */
int tm_wday; /* day of the week */
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
#include <time.h>
#include <stdio.h>
int main(int argc, char *argv[])
{time_t tm;time(&tm);struct tm * t= localtime(&tm);printf("%d-%d-%d %d:%d:%d\n",t->tm_year+1900 ,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);return 0;
}
9.3 ctime
char *ctime(const time_t *timep);
功能:将时间秒数转化成字符串
参数:
timep:保存时间空间的地址
返回值:成功返回获得时间字符串的首地址,失败返回NULL
#include <time.h>
#include <stdio.h>
int main(int argc, char *argv[])
{time_t tm;time(&tm);printf("%s\n",ctime(&tm));return 0;
}
10. uid 和 gid
10.1 getpwuid
struct passwd *getpwuid(uid_t uid);
功能:根据用户id到/etc/passwd文件下解析获得
结构体信息
参数:
uid:用户id
返回值:成功返回id对应用户的信息,失败返回NULL
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>int main(int argc, char *argv[])
{uid_t uid = 1000;struct passwd * pw = getpwuid(uid);if(NULL== pw){fprintf(stderr,"getpwuid error\n");return 1;}printf("name:%s gid:%d info:%s dir:%s shell:%s\n",pw->pw_name,pw->pw_gid,pw->pw_gecos,pw->pw_dir,pw->pw_shell);return 0;
}
10.2 getgrgid
struct group *getgrgid(gid_t gid);
功能:根据gid到/etc/group文件中解析组信息
参数:
gid:组id
返回值:成功返回组信息,失败返回NULL
#include <stdio.h>
#include <sys/types.h>
#include <grp.h>
int main(int argc, char *argv[])
{gid_t gid = 1000;struct group * gr = getgrgid(gid);if(NULL == gr){fprintf(stderr,"getgrgid\n");return 1;}printf("name:%s gid:%d ",gr->gr_name,gr->gr_gid);int i = 0 ;while(NULL!=gr->gr_mem[i]){printf("%s\n",gr->gr_mem[i]);i++;}return 0;
}