重头开始嵌入式第二十一天(Linux系统编程 文件相关函数)

目录

1.getpwuid

2.getpwnam

3.getgrgid

 在 Linux 和类 Unix 系统中,创建软链接(符号链接)的常用指令是  ln -s  。

5.remove

6.rename

8.truncate

9.perror

10.strerror

11.error

1.makefile

2.gdb

strtok


1.getpwuid

getpwuid  函数是 C 语言标准库中的一个函数,用于通过用户 ID 获取对应的用户信息。
 
函数原型通常为:

#include <pwd.h>

struct passwd *getpwuid(uid_t uid);


 参数  uid  是要查询的用户 ID。
 
函数返回一个指向  struct passwd  结构体的指针,如果未找到匹配的用户信息,则返回  NULL  。
 
 struct passwd  结构体通常包含以下成员:
 
-  char *pw_name :用户名。
-  char *pw_passwd :用户密码(通常是加密后的,不可直接使用)。
-  uid_t pw_uid :用户 ID 。
-  gid_t pw_gid :用户组 ID 。
-  char *pw_gecos :用户的备注信息。
-  char *pw_dir :用户的主目录。
-  char *pw_shell :用户的默认 shell 。
 
使用  getpwuid  函数可以方便地获取与特定用户 ID 相关的信息,常用于需要根据用户 ID 进行用户信息处理的程序中。
 

2.getpwnam

getpwnam  函数也是 C 语言标准库中的一个函数,用于通过用户名获取对应的用户信息。

函数原型通常为:

#include <pwd.h>

struct passwd *getpwnam(const char *name);

参数  name  是要查询的用户名。

函数返回一个指向  struct passwd  结构体的指针,如果未找到匹配的用户信息,则返回  NULL  。

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

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

3.getgrgid

getgrgid  函数是 C 语言标准库中的一个函数,用于通过组 ID 获取对应的组信息。

函数原型通常为:

#include <grp.h>

struct group *getgrgid(gid_t gid);

参数  gid  是要查询的组 ID 。

函数返回一个指向  struct group  结构体的指针,如果未找到匹配的组信息,则返回  NULL  。

struct group  结构体通常包含以下成员:

-  char *gr_name :组名。

-  char *gr_passwd :组密码(通常是加密后的,不可直接使用)。

-  gid_t gr_gid :组 ID 。

-  char **gr_mem :组成员用户名列表。

在使用  getgrgid  函数时,要记得对返回值进行检查,以处理未找到对应组信息的情况。

symlink  是 C 语言标准库中的一个函数,用于创建一个符号链接(软链接)。
 
函数原型通常为:
 

#include <unistd.h>

int symlink(const char *target, const char *linkpath);


参数:
 
-  target :指定符号链接所指向的目标路径。
-  linkpath :指定要创建的符号链接的路径。
 
函数返回值:
 
- 成功时返回 0 。
- 失败时返回 -1 ,并设置  errno  来指示错误类型。
 
符号链接是一种特殊的文件类型,它并不包含实际的数据,而是指向另一个文件或目录的路径。通过符号链接,可以更方便地访问目标文件或目录,尤其是在需要创建别名或在不同位置提供相同文件访问的场景中。
 
在使用  symlink  函数时,需要注意以下几点:
 
1. 要有足够的权限来创建符号链接。
2. 目标路径和链接路径都需要是有效的路径字符串。


 
在 Linux 和类 Unix 系统中,创建软链接(符号链接)的常用指令是  ln -s  。

其基本语法为:

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

例如,要创建一个指向文件  file.txt  的软链接  link_to_file.txt  ,可以使用以下命令:

ln -s file.txt link_to_file.txt

如果要创建一个指向目录  directory  的软链接  link_to_directory  ,则使用:

ln -s directory link_to_directory

5.remove

在 C 语言标准库中, remove  函数用于删除指定的文件或空目录。
 
函数原型通常为:

#include <stdio.h>

int remove(const char *filename);

 
 
参数  filename  是要删除的文件或空目录的名称。
 
函数返回值:
 
- 成功删除时返回 0 。
- 失败时返回非零值,并设置  errno  来指示错误类型。
 
常见的错误情况包括文件不存在、没有足够的权限删除文件等。
 
在实际使用时,需要注意确保有足够的权限来执行删除操作,并且要谨慎使用,以免误删重要文件。
 

6.rename

在 C 语言标准库中, rename  函数用于重命名文件或目录。

函数原型通常为:

#include <stdio.h>

int rename(const char *oldname, const char *newname);

参数:

-  oldname :原文件名或目录名。

-  newname :新的文件名或目录名。

函数返回值:

- 重命名成功时返回 0 。

- 失败时返回非零值,并设置  errno  来指示错误类型。

常见的错误情况包括原文件或目录不存在、新文件名已存在、没有足够的权限进行重命名操作等。

例如,如果要将文件  old.txt  重命名为  new.txt  ,可以使用以下代码:

if (rename("old.txt", "new.txt")!= 0) {

    perror("rename");

}

在 C 语言标准库中, link  函数用于创建一个硬链接。
 
函数原型通常为:

#include <unistd.h>

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


参数:
 
-  oldpath :指定已有文件的路径,即要创建链接指向的源文件路径。
-  newpath :指定新创建的硬链接的路径。
 
函数返回值:
 
- 成功创建硬链接时返回 0 。
- 失败时返回 -1 ,并设置  errno  来指示错误类型。
 
硬链接与源文件共享相同的 inode(索引节点),对硬链接或源文件的修改会影响到另一方。但硬链接不能跨文件系统创建,也不能为目录创建硬链接。
 
在使用  link  函数时,需要确保有足够的权限进行操作,并且输入的路径是有效的。
 

8.truncate

在 C 语言标准库中, truncate  函数用于将文件截取到指定的长度。

函数原型通常为:

#include <unistd.h>

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

参数:

-  path :要截取的文件的路径。

-  length :指定文件截取后的长度。

函数返回值:

- 成功时返回 0 。

- 失败时返回 -1 ,并设置  errno  来指示错误类型。

使用  truncate  函数时,需要有对文件的适当权限。

9.perror

“perror”函数是 C 语言标准库中的一个函数,用于将错误信息输出到标准错误输出(通常是控制台)。

其函数原型为: void perror(const char *s); 

参数  s  是一个字符串,通常是对导致错误的操作的简短描述。

当调用  perror  函数时,它首先输出传入的字符串,然后输出一个冒号和空格,接着输出与当前  errno  值对应的系统错误消息。

 errno  是一个全局变量,当系统调用或某些库函数执行出错时,会设置  errno  为一个特定的值来标识错误类型。系统会为每个可能的错误类型提供相应的错误消息文本。

例如,如果尝试打开一个不存在的文件导致错误,在检查到文件指针为  NULL  后调用  perror("Failed to open file") ,输出可能是:“Failed to open file: No such file or directory” 。

“perror”函数的使用非常方便,它能够以直观的方式将用户自定义的描述和系统生成的具体错误消息结合起来,帮助开发者快速理解和定位错误的原因。但需要注意的是,它只能输出与  errno  相关的错误信息,如果错误并非通过设置  errno  来标识,那么  perror  可能无法提供准确有用的信息。

总的来说,“perror”是 C 语言中进行简单错误处理和信息输出的重要工具。

10.strerror

“strerror”函数是 C 语言标准库中的一个函数,用于根据给定的错误编号获取对应的错误消息字符串。

函数原型: char *strerror(int errnum); 

参数:

-  errnum :一个整数,表示错误编号。

返回值:

返回一个指向描述对应错误编号的错误消息字符串的指针。这个字符串是由系统提供的,通常是对特定错误情况的文字描述。 

需要注意的是,每次调用“strerror”可能会返回相同的指针,也可能不是。而且返回的字符串不应被修改。

例如,如果“errno”被设置为 2(通常表示文件未找到),调用“strerror(2)”可能会返回一个类似于 “No such file or directory” 的字符串。

“strerror”函数在处理错误情况、记录错误日志或向用户显示更详细的错误信息时非常有用。

11.error

函数原型:

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

功能:
程序出错打印对应出错原因和用户输入字符串并退出
参数:
status:程序退出的状态
 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;
}

1.makefile

Makefile 是一种在软件开发中用于自动化构建过程的文件。它通常包含一系列规则,用于指定如何编译源代码、链接目标文件、生成可执行文件等操作。

Makefile 的主要优点包括提高开发效率、确保构建的一致性和可重复性。它可以根据文件的修改时间来决定哪些部分需要重新编译,从而节省编译时间。

2.gdb

GDB(GNU Debugger)是一个强大的命令行调试工具,常用于调试 C、C++ 等程序。
 
它允许您在程序运行时查看变量的值、设置断点、单步执行代码、查看调用栈等,以帮助您找出程序中的错误和问题。
 
使用 GDB 调试程序通常包括以下步骤:
 
1. 编译程序时添加调试信息:使用  -g  选项编译,例如  gcc -g program.c -o program  。
2. 启动 GDB 并加载可执行文件:在命令行中输入  gdb program  。
3. 设置断点:可以使用  break  命令在特定的行或函数处设置断点,例如  break main  (在  main  函数处设置断点)或  break 10  (在第 10 行设置断点)。
4. 运行程序:使用  run  命令运行程序,程序会在遇到断点时暂停。
5. 查看变量的值:可以使用  print  命令查看变量的值,例如  print var_name  。
6. 单步执行:使用  next  命令单步执行下一行代码(不进入函数内部),使用  step  命令单步执行(进入函数内部)。
7. 查看调用栈:使用  backtrace  命令查看函数调用栈。
8. 继续执行:使用  continue  命令让程序继续运行,直到遇到下一个断点或程序结束。
 
GDB 提供了丰富的命令和选项,可以根据具体的调试需求灵活运用。它对于理解程序的执行流程和查找错误非常有帮助。

strtok

strtok  是 C 标准库中的一个函数,用于将字符串分割成一系列标记(tokens)。

函数原型: char *strtok(char *str, const char *delim) 

 str  是要被分割的字符串。如果第一次调用  strtok  时, str  不为  NULL ,则后续调用该函数时, str  应设置为  NULL 。

 delim  是用于分割的定界符字符集合。

工作原理: strtok  会在  str  中查找  delim  中的字符,并将其替换为  '\0' ,从而将字符串分割成多个子串。每次成功调用都会返回一个指向当前分割出的标记的指针,当没有更多的标记可分割时,返回  NULL 。

以下是一个简单的示例代码:

#include <stdio.h>

#include <string.h>



int main() {

    char str[] = "Hello,World!How,Are,You?";

    char *token;

    char delim[] = ", ";



    token = strtok(str, delim);

    while (token!= NULL) {

        printf("%s\n", token);

        token = strtok(NULL, delim);

    }



    return 0;

}

在上述示例中,通过  strtok  函数以  ", "  作为分隔符,将字符串  str  分割成多个子串并打印出来。

需要注意的是, strtok  函数会直接修改原始字符串,并且不是线程安全的。在多线程环境或需要保持原始字符串不变的情况下,可能需要考虑使用其他更安全和灵活的字符串分割方法。

  • 19
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值