Linux基本指令和常用函数

116 阅读10分钟

1.ioctl

ioctl 函数。ioctl 是一个系统调用,用于在 UNIX 或 UNIX-like 操作系统中进行设备控制操作。它的名称是 "input/output control" 的缩写,可以用于控制设备的各种方面,如设备的打开、关闭、配置、查询状态等

int ioctl(int fd, unsigned long request, ...);

ioctl 函数的具体使用方式和支持的请求代码取决于所操作的设备和操作系统。不同设备和操作系统可能支持不同的 ioctl 请求,因此需要根据具体的设备文档或系统文档来了解可用的请求代码和参数。

需要注意的是,ioctl 函数使用较为底层的设备控制接口,需要谨慎使用,并且要遵循设备和操作系统的规范和要求。在使用 ioctl 函数时,建议查阅相关文档以了解特定设备和操作系统的使用指南和最佳实践。

ioctl 函数的 request 参数是一个无符号长整型(unsigned long),它用于指定具体的控制操作类型。在不同的系统和设备中,支持的请求代码会有所不同。以下是一些常见的 request 参数类型:

  1. 整数值(常量):某些 ioctl 请求可以使用整数值作为请求代码。例如,使用特定整数值可以表示打开设备、关闭设备等操作。
  2. 预定义的宏:操作系统或设备可能定义了一些特定的宏,用于表示常见的控制操作。这些宏通常以 IOIOC 开头,后跟具体的操作类型或设备标识。例如,TIOCGWINSZ 是一个预定义的宏,用于获取终端窗口大小。
  3. 自定义请求:某些情况下,您可以使用自定义的请求代码来执行特定的控制操作。这些自定义请求代码通常由设备或操作系统的开发者定义,并且可能需要参考相关文档来了解其含义和使用方式。

需要注意的是,具体的请求代码类型和取值范围会因设备和操作系统而异。因此,在使用 ioctl 函数时,建议查阅相关文档或头文件以了解特定设备或操作系统下可用的请求代码及其用法

是的,我熟悉 FBIOGET_VSCREENINFO 这个参数。它是在 Linux 系统中使用 ioctl 函数来获取帧缓冲设备(Frame Buffer Device)的虚拟屏幕信息的请求代码。

FBIOGET_VSCREENINFO 是一个预定义的宏常量,定义在 <linux/fb.h> 头文件中。在使用该请求代码时,需要将它作为 ioctl 函数的 request 参数传递给帧缓冲设备的文件描述符。

2.mmap

利用mamp()函数申请一段用户空间的内存区域,并映射到内核空间某个内存区域; mamp() 函数原型如下:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

返回值: 失败返回-1,并设置errno值.成功,返回映射的地址指针.若指定start则返回0; addr: 需要映射的内存起始地址,通常填NULL,表示让系统自动映射,映射成功后返回该地址; length: 映射地址的大小,填LCD显存字节数即可,因为2440一个地址存8位; prot: 对映射地址的保护(protect)方式,常用组合如下:        PROT_EXEC 映射区域可被执行        PROT_READ 映射区域可被读取        PROT_WRITE 映射区域可被写入        PROT_NONE 映射区域不可访问 flag: 填MAP_SHARED即可,表示共享此映射,对其它进程可见. fd: 需要将内存映射到哪个文件描述符(以后便可以直接通过内存来直接操作该文件) offset: 映射偏移值,填0即可.

3.munmap

int munmap(void *addr, size_t length);

返回值: 成功返回0,失败返回-1,并设置errno值;

addr: 要取消映射的内存起始地址;

length: 映射地址的大小;

4.strcmp

C 库函数 int strcmp(const char *str1, const char *str2)str1 所指向的字符串和 str2 所指向的字符串进行比较。

int strcmp(const char *str1, const char *str2)
  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。

5.strncmp

strncmp 函数是C语言中的字符串比较函数,用于比较两个字符串的前n个字符是否相等。函数的原型如下:

int strncmp(const char *str1, const char *str2, size_t n);

函数接受三个参数:

  • str1:指向第一个字符串的指针。
  • str2:指向第二个字符串的指针。
  • n:要比较的字符数。

strncmp 函数会比较 str1str2 的前n个字符。如果这些字符完全相同,则函数返回0。如果不同,函数返回一个负数(小于0)或正数(大于0),表示第一个不匹配字符的ASCII码差值。

需要注意的是,strncmp 函数会在比较时考虑字符串的终止符(\0),因此即使比较的字符数超过了字符串的长度,函数也会正确地比较,并返回相应的结果

6.fileno

fileno 函数是一个标准库函数,位于 <stdio.h> 头文件中。它用于获取给定文件流(FILE 结构体指针)对应的文件描述符(int 类型)。

文件描述符是一个非负整数,用于在操作系统中标识打开的文件。文件描述符可以用于执行对文件的读取、写入和其他操作。

int fileno(FILE *stream);

fileno 函数的作用是将文件流对象转换为对应的文件描述符。它可以用于在需要直接操作文件描述符的情况下,获取文件描述符的值。

需要注意的是,使用 fileno 函数之前,必须先通过 fopen 或其他文件打开函数打开文件并获得文件流对象。如果文件打开失败或文件流对象为空指针,使用 fileno 函数将会产生未定义的行为。因此,在使用 fileno 之前,需要确保文件已经成功打开。

7.fstat

fstat 函数是一个系统调用函数,用于获取指定文件的状态信息。它可以用于获取文件的大小、权限、修改时间等属性。

int fstat(int fd, struct stat *buf);

参数 fd 是文件描述符,表示要获取状态信息的文件。

参数 buf 是一个指向 struct stat 结构体的指针,用于存储获取到的文件状态信息。

fstat 函数执行成功时返回 0,失败时返回 -1,并设置相应的错误码。

struct stat 结构体定义如下:

struct stat {
    dev_t st_dev;         // 文件所在设备的设备号
    ino_t st_ino;         // 文件的 i-node 号
    mode_t st_mode;       // 文件的类型和权限
    nlink_t st_nlink;     // 文件的硬链接数量
    uid_t st_uid;         // 文件的所有者 ID
    gid_t st_gid;         // 文件的所有者所在组 ID
    dev_t st_rdev;        // 若文件为特殊文件,则为其设备号
    off_t st_size;        // 文件大小(字节数)
    blksize_t st_blksize; // 文件系统 I/O 缓冲区大小
    blkcnt_t st_blocks;   // 文件所占的磁盘块数量
    time_t st_atime;      // 文件的最后访问时间
    time_t st_mtime;      // 文件的最后修改时间
    time_t st_ctime;      // 文件的最后状态更改时间
};

需要注意的是,在使用 fstat 函数之前,需要确保文件已经成功打开,并且文件描述符 fd 是有效的。否则,函数可能会产生未定义的行为。

8.snprintf

snprintf 是一个格式化输出函数,用于将格式化的数据写入字符串缓冲区中。它类似于 sprintf 函数,但是多了一个参数用于指定缓冲区的大小,以避免缓冲区溢出

int snprintf(char *str, size_t size, const char *format, ...);

参数 str 是一个指向字符数组的指针,用于存储格式化后的字符串。

参数 size 是目标字符数组的大小,即缓冲区的最大长度。

参数 format 是一个格式化字符串,用于指定输出的格式。

snprintf 函数根据 format 字符串中的格式说明符和可变参数列表,将格式化的数据写入 str 指向的字符数组中,最多写入 size-1 个字符,并在最后添加字符串结束符 '\0'。

一般用来拼接字符串

9.stat 函数

stat 是一个系统调用函数,用于获取文件的状态信息,包括文件的大小、权限、修改时间等。

int stat(const char *path, struct stat *buf);

参数 path 是一个指向文件路径的字符串,表示要获取信息的文件。

参数 buf 是一个指向 struct stat 结构体的指针,用于存储获取到的文件状态信息。

stat 函数执行成功时返回 0,失败时返回 -1,并设置相应的错误码。

10.S_ISDIR

S_ISDIR 是一个宏定义,在 <sys/stat.h> 头文件中定义。它用于检查给定文件的模式是否表示一个目录。

int S_ISDIR(mode_t mode);

参数 mode 是一个用于表示文件模式的整数值,通常是通过 statlstat 函数获取的文件状态结构体中的 st_mode 成员。

S_ISDIR 宏在检查给定的文件模式时,会检查文件类型位 (st_mode & S_IFMT) 是否与目录类型位 (S_IFDIR) 匹配,如果匹配则返回非零值,表示是目录;否则返回 0,表示不是目录。

需要注意的是,使用 S_ISDIR 宏前,应先通过 statlstat 函数获取文件的状态信息,并确保操作系统支持该宏。

11.scandir

scandir 函数是一个目录遍历函数,用于获取指定目录下的文件列表

int scandir(const char *dir, struct dirent ***namelist,
            int (*filter)(const struct dirent *),
            int (*compar)(const struct dirent **, const struct dirent **));

参数 dir 是一个指向目录路径的字符串,表示要遍历的目录。

参数 namelist 是一个指向指针数组的指针,用于存储获取到的文件列表。函数将分配内存来存储文件列表,并通过 namelist 返回指向该内存的指针。每个元素都是一个指向 struct dirent 结构体的指针,用于表示目录中的一个文件。

参数 filter 是一个函数指针,用于指定一个可选的过滤函数。该过滤函数用于确定哪些文件应该包含在结果列表中。如果传递 NULL,则所有文件都会被包含。

参数 compar 是一个函数指针,用于指定一个可选的比较函数。该比较函数用于指定文件列表的排序顺序。如果传递 NULL,则文件列表将按照系统的默认排序顺序进行排序。

scandir 函数执行成功时返回获取到的文件数目,失败时返回 -1,并设置相应的错误码

需要注意的是,使用 scandir 函数前,应确保指定的目录存在并且有足够的权限访问。另外,记得在使用完文件列表后,释放内存以避免内存泄漏。

入门Linux,基本指令和vim编辑器是必须会得,下面附上基本指令和vim编辑器思维导图。

Linux指令合集.png

vim编辑器.png