目录操作(2)(21)

发布于:2024-08-20 ⋅ 阅读:(138) ⋅ 点赞:(0)

1.getpwuid

struct passwd *getpwuid(uid_t uid);

功能:

根据用户id到k's文件下解析获得

结构体信息

参数:

uid:用户id

返回值:

成功返回id对应用户的信息

失败返回NULL

eg:接受返回值struct passwd * pw = getpwuid(uid);

struct passwd {
    char *pw_name;    /* 用户名 */
    char *pw_passwd;  /* 密码(通常为空,因为密码已经被加密存储在其他地方) */
    uid_t pw_uid;     /* 用户的 UID */
    gid_t pw_gid;     /* 用户的 GID */
    char *pw_gecos;   /* 用户信息(通常是全名或其他描述) */
    char *pw_dir;     /* 用户的主目录 */
    char *pw_shell;   /* 用户的默认 shell */
};
#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;
}

2.getpwnam

函数原型

getpwnam 的函数原型定义在头文件 <pwd.h> 中,如下所示:


c #include <pwd.h>struct passwd *getpwnam(const char *name);

参数

  • name: 指向以 null 结尾的字符串,表示要查找的用户名。

返回值

  • 成功时,getpwnam 返回一个指向 passwd 结构的指针,该结构包含用户的相关信息。

  • 如果用户名不存在或发生错误,则返回 NULL

它与 getpwuid 函数的区别在于, getpwuid 是通过用户 ID 来获取用户信息,而 getpwnam 是通过用户名来获取。

在实际编程中,使用这两个函数时,需要注意对返回值进行判断,以处理未找到对应信息的情况。

3.getgrgid

struct group *getgrgid(gid_t gid);

功能:

根据gid到/etc/group文件中解析组信息

参数:

gid:组id

返回值:

成功返回组信息

失败返回NULL

软链接文件、符号链接文件

硬链接文件

命令行:ln -s 123 softlink 快捷方式

struct group {
    char *gr_name;    // 组名
    char *gr_passwd;  // 组密码(通常为空,因为组密码通常不使用)
    gid_t gr_gid;     // 组 ID
    char **gr_mem;    // 组成员列表(指向用户名数组)
};

常用命令函数

1.symlink

int symlink(const char *oldpath, const char *newpath);

功能:

创建一个链接向oldpath文件的新符号链接文件

软连接,快捷方式删除不影响源文件,源文件删除软链接失效(类似于在桌面创建一个快捷方式)

参数:

oldpath:被链接向的文件的路径

newpath:新符号链接文件

返回值:

成功返回0

失败返回-1

在linux中创建软链接命令为ln -s

语法为 ln -s 源文件或目录 软链接名称

#include <stdio.h>
#include <unistd.h>
// ln -s  123 softlink 

int main(int argc, char *argv[])
{
    int ret = symlink("/home/linux/1.png","softlink");
    if(-1 == ret)
    {
        fprintf(stderr,"symlink error\n");
        return 1;
    }

    return 0;
}

2.remove rm -fr

int remove(const char *pathname);

功能:

删除一个文件

参数:

pathname:删除文件的路径

返回值:

成功返回0

失败返回-1

3.rename //mv rename

int rename(const char *oldpath, const char *newpath);

功能:

将一个老的路径名改为新的路径

参数:

oldpath:老路径名

newpath:新路径名

返回值:

成功返回0

失败返回-1

#include <stdio.h>
int main(int argc, char *argv[])
{
    
    int ret = rename("./aaa","./bbb"); 
    if(-1 ==ret)
    {
        fprintf(stderr,"rename error\n");
        return 1;
    }
    return 0;
}

4.link ln 1 2

int link(const char *oldpath, const char *newpath);

功能:

创建一个硬链接文件(只能链接文件不能链接目录)

删除哪一个都不影响

参数:

oldpath:要链接向的文件

newpath:创建的新硬链接文件

返回值:

成功返回0

失败返回-1

5.truncate

修改一个已存在文件大小

#include <unistd.h>

int truncate(const char *path, off_t length);

eg:

int ret = truncate("bigfile",1024*1024*1024);

修改一个文件的大小到1G


#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
    fopen("bigfile","w");
    int ret = truncate("bigfile",1024*1024*1024);    
    if(-1 == ret)
    {
        fprintf(stderr,"truncate error\n");
        perror("truncate");
        return 1;
    }
    return 0;
}

相关报错函数

errno

errno是一个出错码,在#include <errno.h> //extern int errno里面声明

很多函数再出错的时候都会将errno置为一个数,c语言有大概一百多个错误

1.perror

void perror(const char *s);-->strerror() stderr

打印出字符串之后,在之后继续打出errno对应的错误信息

功能:

打印s字符串和errno对应的错误信息

参数:

s:要打印在终端上的出错信息

返回值:

缺省

eg:

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE* fp = fopen("aaa","r");//打开失败,errno获得一个错误码
    if(NULL == fp)
    {
        perror("fopen");//会返回errno对应的错误
        return 1;
    
    }
    return 0;
}

2.strerror

char *strerror(int errnum);

功能:

打印errnum出错码对应的出错信息

参数:

errnum:出错errno号

返回值:

成功返回对应的错误信息

ruturn 1;

可以使用以下代码打印出c语言对应的错误信息

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    int i =0 ;
    for(i=0;i<256;i++)
    {
        printf("%d %s\n",i,strerror(i));
    }
    
    return 0;
}

3.error ===>>>exit();

void error(int status, int errnum, const char *format, ...);

功能:

程序出错打印对应出错原因和用户输入字符串并退出

参数:

status:程序退出的状态(大概对应return)

EXIT_FAILURE 1 EXIT_SUCCESS 0 errnum:错误码

format:

类似printf打印

返回值:

缺省

__FILE__ 表示所在的文件名

__LINE__表示第几行

__func__表示在那个函数

__DATE__日期

__TIME__时间

c 内置宏不需要头文件既可使用

#include <stdio.h>
#include <error.h>
#include <errno.h> //extern int errno
int main(int argc, char *argv[])
{
    FILE* fp = fopen("aaa","r");    
    if(NULL == fp)
    {
        //perror("fopen");
        error(1,errno,"fopen,file:%s fun:%s line:%d",__FILE__,__func__,__LINE__);
        printf("aaaa\n");
        return 1;
    
    }
    return 0;
}

Makefile 编写 工程管理工具

vim 编辑器,gcc 编译器 ,gdb 调试器 make

Gdb -->gnu debug

make文件的两种写法Makefile makefile

Makefile一共有三种写法,一般常用下面这种

SRC = main.c 
SRC += add.c
SRC += mul.c 
OBJ = all
#自定义的变量flag 
FALG = -g 
LIB = -lm
CC = gcc 
$(OBJ):$(SRC)
        $(CC) $(SRC) -o $(OBJ) $(FLAG) $(LIB)

clean:
        rm $(OBJ)

另外两种写法

all:main.c add.c mul.c
        gcc $^ -o $@

clean:
        rm all
        
all:main.c add.c mul.c
        gcc main.c add.c mul.c -o all

clean:
        rm all

gdb

GDB(GNU Debugger)是一个强大的命令行调试工具,常用于调试 C、C++ 等程序。

它允许您在程序运行时查看变量的值、设置断点、单步执行代码、查看调用栈等,以帮助您找出程序中的错误和问题。

1.找段错误

(1)gcc -g *.c 加上调试选项-g

(2)gdb a.out调试可执行文件

(3)按r(run)直接开始运行

(4)重现段错误

(5)where 找出段错误的位置

-->l *.c:10//l加上文件名冒号行号

按q退出

2.一般错误

(1)gcc -g -lpthread 1.c

(2)gdb a.out

(3)b fun.c:36 设置断点,运行到这个位置,程序自动暂停

(4)r运行

(5)n执行下一步

(6)使用p命令,查看变量或指针等数据

strtok函数

strtok 是一个用于分割字符串的标准库函数,其原型如下:

#include <string.h>

char *strtok(char *str, const char *delim);

函数参数

  • str: 要分割的字符串。第一次调用时提供字符串,后续调用时传递 NULL。因为strtok函数里有静态指针,记录了上一次的读写位置

  • delim: 字符串中的分隔符字符集合。

返回值

  • 成功时,返回指向下一个分割子字符串的指针。

  • 如果没有更多的分割子字符串,返回 NULL

功能

  • strtok 使用 delim 中的字符作为分隔符,将 str 分割成若干个子字符串。

  • 每次调用 strtok 时返回下一个子字符串,直到所有子字符串都被处理完。

eg:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello,world,this,is,a,test";
    const char *delim = ",";

    char *token = strtok(str, delim);
    while (token != NULL) {
        printf("%s\n", token);
        token = strtok(NULL, delim);
    }

    return 0;
}
  • strtok 修改原始字符串,将分隔符替换为 \0


网站公告

今日签到

点亮在社区的每一天
去签到