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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值