当前位置:   article > 正文

Linux-笔记 应用编程函数总结

Linux-笔记 应用编程函数总结

之前一直没做总结,这里总结一下。

一、文件I/O

        open

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. int open(const char *pathname, int flags);
  5. 例子:
  6. int fd;
  7. fd = open("./test_kondon", O_WRONLY | O_CREAT | O_EXCL);

write

  1. #include <unistd.h>
  2. ssize_t write(int fd, const void *buf, size_t count);
  3. 例子:
  4. int fd1, ret;
  5. char buffer[50] = "hello world";
  6. fd1 = open("/src_file", O_RDONLY);
  7. if (-1 == fd1) {
  8. printf("open src_file error");
  9. return -1;
  10. }
  11. ret = write(fd1, buffer, sizeof(buffer));
  12. if (ret == -1) {
  13. printf("Error: write dest_file failed!\n");
  14. goto err1;
  15. }
  16. ret = 0;
  17. close(fd1);
  18. err1:
  19. close(fd1);

read

  1. #include <unistd.h>
  2. ssize_t read(int fd, void *buf, size_t count);
  3. 例子:
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <fcntl.h>
  9. #include <unistd.h>
  10. #include <linux/input.h>
  11. int main(int argc, char **argv) {
  12. int fd1, ret;
  13. char buffer[1024];
  14. fd1 = open("/src_file", O_RDONLY);
  15. if (-1 == fd1) {
  16. printf("open src_file error");
  17. return -1;
  18. }
  19. ret = lseek(fd1, 500, SEEK_SET);
  20. if (-1 == ret)
  21. goto err1;
  22. ret = read(fd1, buffer, sizeof(buffer));
  23. if (-1 == ret) {
  24. printf("Error: read src_file filed!\n");
  25. goto err1;
  26. }
  27. ret = 0;
  28. close(fd1);
  29. err1:
  30. close(fd1);
  31. }

close

  1. #include <unistd.h>
  2. int close(int fd);

lseek

  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. off_t lseek(int fd, off_t offset, int whence);
  4. //SEEK_SET SEEK_CUR SEEK_END
  5. 例子:
  6. int fd1, fd2, ret;
  7. char buffer[1024];
  8. fd1 = open("/src_file", O_RDONLY);
  9. if (-1 == fd1) {
  10. printf("open src_file error");
  11. return -1;
  12. }
  13. fd2 = open("/dest_file", O_WRONLY | O_CREAT | O_EXCL | S_IRWXU | S_IRGRP | S_IROTH);
  14. if (fd2 == -1) {
  15. printf("open dest_file error");
  16. ret = -1;
  17. goto err1;
  18. }
  19. ret = lseek(fd1, 500, SEEK_SET);
  20. if (-1 == ret)
  21. goto err2;
  22. ret = read(fd1, buffer, sizeof(buffer));
  23. if (-1 == ret) {
  24. printf("Error: read src_file filed!\n");
  25. goto err2;
  26. }
  27. ret = lseek(fd2, 0, SEEK_SET);
  28. if (-1 == ret) {
  29. goto err2;
  30. }
  31. ret = write(fd2, buffer, sizeof(buffer));
  32. if (ret == -1) {
  33. printf("Error: write dest_file failed!\n");
  34. goto err2;
  35. }
  36. ret = 0;
  37. close(fd1);
  38. close(fd2);
  39. err2:
  40. close(fd2);
  41. err1:
  42. close(fd1);

perror

  1. #include <stdio.h>
  2. void perror(const char *s);
  3. 例子:
  4. int fd;
  5. /* 打开文件 */
  6. fd = open("./test_file", O_RDONLY);
  7. if (-1 == fd) {
  8. perror("open error");
  9. return -1;
  10. }
  11. close(fd);
  12. return 0;

dup

  1. #include <unistd.h>
  2. int dup(int oldfd);
  3. //复制文件描述符

dup2

  1. #include <unistd.h>
  2. int dup2(int oldfd, int newfd);
  3. //复制文件描述符

pread & pwrite

  1. #include <unistd.h>
  2. ssize_t pread(int fd, void *buf, size_t count, off_t offset);
  3. //先调用lseek再read
  4. ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
  5. //先调用lseek再write

fcntl

:fcntl()函数可以对一个已经打开的文件描述符执行一系列控制操作,譬如复制一个文件描述符(与 dup、dup2 作用相同)、获取/设置文件描述符标志、获取/设置文件状态标志等,类似于一个多功能文件描述符管理工具箱

  1. //fcntl()函数可以对一个已经打开的文件描述符执行一系列控制操作,譬如复制一个文件描述符(与 dup、dup2 作用相同)、获取/设置文件描述符标志、获取/设置文件状态标志等,类似于一个多功能文件描述符管理工具箱
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. int fcntl(int fd, int cmd, ... /* arg */ )
  5. ⚫ 复制文件描述符(cmd=F_DUPFD 或 cmd=F_DUPFD_CLOEXEC);
  6. ⚫ 获取/设置文件描述符标志(cmd=F_GETFD 或 cmd=F_SETFD);
  7. ⚫ 获取/设置文件状态标志(cmd=F_GETFL 或 cmd=F_SETFL);
  8. ⚫ 获取/设置异步 IO 所有权(cmd=F_GETOWN 或 cmd=F_SETOWN);
  9. ⚫ 获取/设置记录锁(cmd=F_GETLK 或 cmd=F_SETLK);

ioctl

:文件 IO 操作,一般用于操作特殊文件或硬件外设,通过 ioctl 获取 LCD 相关信息等

  1. //文件 IO 操作,一般用于操作特殊文件或硬件外设,通过 ioctl 获取 LCD 相关信息等
  2. #include <sys/ioctl.h>
  3. int ioctl(int fd, unsigned long request, ...);

truncate & ftruncate

  1. //将普通文件截断为指定字节长度,ftruncate()使用文件描述符 fd 来指定目标文件,truncate()则直接使用文件路径 path 来指定目标文件
  2. //使用 ftruncate()函数进行文件截断操作之前,必须调用 open()函数打开该文件得到文件描述符,并且必
  3. 须要具有可写权限,也就是调用 open()打开文件时需要指定 O_WRONLY 或 O_RDWR。调用这两个函数并不会导致文件读写位置偏移量发生改变,所以截断之后一般需要重新设置文件当前的读写位置偏移量
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. int truncate(const char *path, off_t length);
  7. int ftruncate(int fd, off_t length);
  8. 例子:
  9. /* 使用 ftruncate 将 file1 文件截断为长度 0 字节 */
  10. if (0 > ftruncate(fd, 0)) {
  11. perror("ftruncate error");
  12. exit(-1);
  13. }
  14. /* 使用 truncate 将 file2 文件截断为长度 1024 字节 */
  15. if (0 > truncate("./file2", 1024)) {
  16. perror("truncate error");
  17. exit(-1);
  18. }

二、标准I/O   

        标准 I/O 库函数是构建于文件 I/O open() read() write() lseek() close() 等)这些系统调用之上的, 譬如标准 I/O 库函数 fopen() 就利用系统调用 open() 来执行打开文件的操作、 fread() 利用系统调用 read() 来执行读文件操作、fwrite() 则利用系统调用 write() 来执行写文件操作等等。

 

fopen

  1. #include <stdio.h>
  2. FILE *fopen(const char *path, const char *mode);

fclose

  1. #include <stdio.h>
  2. int fclose(FILE *stream);

fread 

  1. #include <stdio.h>
  2. size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  3. 例子:
  4. FILE *fp = NULL;
  5. char buf[50] = {0};
  6. int size = 0;
  7. int ret = 0;
  8. if (NULL == (fp = fopen("./test_file1", "r"))) {
  9. perror("test_file1 open failed");
  10. exit(-1);
  11. }
  12. ret = fseek(fp, 0, SEEK_END);
  13. if (ret < 0) {
  14. perror("test_file1 seek failed");
  15. fclose(fp);
  16. exit(-1);
  17. }
  18. long fileSize = ftell(fp);
  19. printf("文件大小:%ld\r\n", fileSize);
  20. printf("文件打开成功\r\n");
  21. ret = fseek(fp, 0, SEEK_SET);
  22. if (ret < 0) {
  23. perror("test_file1 seek failed");
  24. fclose(fp);
  25. exit(-1);
  26. }
  27. if (0 > (size = fread(buf, 1, fileSize, fp))) {
  28. printf("文件读取失败\r\n");
  29. fclose(fp);
  30. exit(-1);
  31. }
  32. printf("读取到 %d 个数据:%s\r\n", size, buf);
  33. fclose(fp);
  34. exit(0);

fwrite

  1. #include <stdio.h>
  2. size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  3. 例子:
  4. char buf[] = "Hello World\n";
  5. FILE *fp = NULL;
  6. if (NULL == (fp = fopen("./test_file1", "w"))) {
  7. perror("Couldn't open");
  8. exit(-1);
  9. }
  10. printf("文件打开成功");
  11. if (sizeof(buf) > fwrite(buf, 1, sizeof(buf), fp)) {
  12. printf("Couldn't write");
  13. fclose(fp);
  14. exit(-1);
  15. }
  16. printf("写入数据成功\n");
  17. fclose(fp);
  18. exit(0);

fseek

  1. #include <stdio.h>
  2. int fseek(FILE *stream, long offset, int whence);
  3. 例子:
  4. //fseek(file, 0, SEEK_SET);
  5. //fseek(file, 0, SEEK_END);
  6. //fseek(file, 100, SEEK_SET);
  7. FILE *fp = NULL;
  8. int ret = 0;
  9. char read_buf[100] = {0};
  10. char write_buf[] = "www.example.com\r\n";
  11. if (NULL == (fp = fopen("./test_file", "w+"))) {
  12. perror("Couldn't open");
  13. exit(-1);
  14. }
  15. printf("文件打开成功\r\n");
  16. if (sizeof(write_buf) > fwrite(write_buf, 1, sizeof(write_buf), fp)) {
  17. printf("Couldn't write");
  18. fclose(fp);
  19. exit(-1);
  20. }
  21. printf("文件写入成功\r\n");
  22. if (0 > fseek(fp, 0, SEEK_SET)) {
  23. perror("FSEEK could");
  24. fclose(fp);
  25. exit(-1);
  26. }
  27. printf("文件定位头成功\r\n");
  28. if (sizeof(write_buf) > (ret = fread(read_buf, 1, sizeof(read_buf), fp))) {
  29. printf("Couldn't read");
  30. fclose(fp);
  31. exit(-1);
  32. }
  33. printf("读取到 %d 个字符:%s\r\n", ret, read_buf);
  34. fclose(fp);
  35. exit(0);

ftell

   :获取文件当前的读写位置偏移量
  1. #include <stdio.h>
  2. long ftell(FILE *stream);
  3. 例子:
  4. /* 获取当前位置偏移量 */
  5. if (0 > (ret = ftell(fp))) {
  6. perror("ftell error");
  7. fclose(fp);
  8. exit(-1);
  9. }

feof

测试参数 stream 所指文件的 end-of-file 标志,如果 end-of-file 标志被设置了,则调用feof()函数将返回一个非零值,如果 end-of-file 标志没有被设置,则返回 0

  1. //当文件的读写位置移动到了文件末尾时,end-of-file 标志将会被设置
  2. #include <stdio.h>
  3. int feof(FILE *stream);
  4. 例子:
  5. FILE *fp = NULL;
  6. int ret = 0;
  7. char read_buf[100] = {0};
  8. char write_buf[] = "www.example.com\r\n";
  9. if (NULL == (fp = fopen("./test_file", "w+"))) {
  10. perror("Couldn't open");
  11. exit(-1);
  12. }
  13. printf("文件打开成功\r\n");
  14. if (sizeof(write_buf) > fwrite(write_buf, 1, sizeof(write_buf), fp)) {
  15. printf("Couldn't write");
  16. fclose(fp);
  17. exit(-1);
  18. }
  19. printf("文件写入成功\r\n");
  20. if (0 > fseek(fp, 0, SEEK_SET)) {
  21. perror("FSEEK could");
  22. fclose(fp);
  23. exit(-1);
  24. }
  25. printf("文件定位头成功\r\n");
  26. while (1) {
  27. if (sizeof(write_buf) > (ret = fread(read_buf, 1, sizeof(read_buf), fp))) {
  28. printf("Couldn't read\r\n");
  29. fclose(fp);
  30. exit(-1);
  31. }
  32. if (feof(fp)) {
  33. printf("到达文件末尾\r\n");
  34. break;
  35. }
  36. }
  37. printf("读取到 %d 个字符:%s\r\n", ret, read_buf);
  38. fclose(fp);
  39. exit(0);

ferror

测试参数 stream 所指文件的错误标志,如果错误标志被设置了,则调用 ferror()函数将返回一个非零值,如果错误标志没有被设置,则返回 0

  1. #include <stdio.h>
  2. int ferror(FILE *stream);
  3. 例子:
  4. FILE *fp = NULL;
  5. int ret = 0;
  6. char read_buf[100] = {0};
  7. char write_buf[] = "www.example.com\r\n";
  8. if (NULL == (fp = fopen("./test_file", "w+"))) {
  9. perror("Couldn't open");
  10. exit(-1);
  11. }
  12. printf("文件打开成功\r\n");
  13. if (sizeof(write_buf) > fwrite(write_buf, 1, sizeof(write_buf), fp)) {
  14. printf("Couldn't write");
  15. fclose(fp);
  16. exit(-1);
  17. }
  18. printf("文件写入成功\r\n");
  19. if (0 > fseek(fp, 0, SEEK_END)) {
  20. perror("FSEEK could");
  21. fclose(fp);
  22. exit(-1);
  23. }
  24. printf("文件定位头成功\r\n");
  25. while (1) {
  26. if (sizeof(write_buf) > (ret = fread(read_buf, 1, sizeof(read_buf), fp))) {
  27. if (ferror(fp)) {
  28. printf("Couldn't read");
  29. fclose(fp);
  30. exit(-1);
  31. }
  32. }
  33. if (feof(fp)) {
  34. printf("到达文件末尾\r\n");
  35. break;
  36. }
  37. }
  38. printf("读取到 %d 个字符:%s\r\n", ret, read_buf);
  39. fclose(fp);
  40. exit(0);

clearerr

清除 end-of-file 标志和错误标志,当调用 feof()ferror()校验这些标志后,通常需要清除这些标志,避免下次校验时使用到的是上一次设置的值,此时可以手动调用 clearerr()函数清除标志。

  1. #include <stdio.h>
  2. void clearerr(FILE *stream);
  3. 例子:
  4. FILE *fp = NULL;
  5. int ret = 0;
  6. char read_buf[100] = {0};
  7. char write_buf[] = "www.example.com\r\n";
  8. if (NULL == (fp = fopen("./test_file", "w+"))) {
  9. perror("Couldn't open");
  10. exit(-1);
  11. }
  12. printf("文件打开成功\r\n");
  13. if (sizeof(write_buf) > fwrite(write_buf, 1, sizeof(write_buf), fp)) {
  14. printf("Couldn't write");
  15. fclose(fp);
  16. exit(-1);
  17. }
  18. printf("文件写入成功\r\n");
  19. if (0 > fseek(fp, 0, SEEK_SET)) {
  20. perror("FSEEK could");
  21. fclose(fp);
  22. exit(-1);
  23. }
  24. printf("文件定位头成功\r\n");
  25. while (1) {
  26. if (sizeof(write_buf) > (ret = fread(read_buf, 1, sizeof(read_buf), fp))) {
  27. printf("Couldn't read\r\n");
  28. fclose(fp);
  29. exit(-1);
  30. }
  31. if (feof(fp)) {
  32. printf("到达文件末尾1\r\n");
  33. clearerr(fp); //清除标志,后面的输入输出操作继续进行
  34. if (feof(fp)) {
  35. printf("到达文件末尾2\r\n");
  36. }
  37. break;
  38. }
  39. }
  40. printf("读取到 %d 个字符:%s\r\n", ret, read_buf);
  41. fclose(fp);
  42. exit(0);

格式化I/O:格式化输出

  1. #include <stdio.h>
  2. int printf(const char *format, ...);
  3. int fprintf(FILE *stream, const char *format, ...);
  4. int dprintf(int fd, const char *format, ...);
  5. int sprintf(char *buf, const char *format, ...);
  6. int snprintf(char *buf, size_t size, const char *format, ...);
  7. printf("Hello World!\n");
  8. //格式化数据写入到由 FILE 指针指定的文件中
  9. fprintf(stderr, "Hello World!\n");
  10. //格式化数据写入到由文件描述符 fd 指定的文件中
  11. dprintf(STDERR_FILENO, "Hello World!\n");
  12. //格式化数据存储在由参数 buf 所指定的缓冲区中
  13. char buf[100];
  14. sprintf(buf, "Hello World!\n");
  15. char buf[20] = {0};
  16. sprintf(buf, "%d", 100);
格式控制字符串 format
  1. printf("转换说明 1 转换说明 2 转换说明 3", arg1, arg2, arg3);
  2. 转换说明:%[flags][width][.precision][length]type
  3. %(必选)
  4. flags:标志,可包含 0 个或多个标志;
  5. width:输出最小宽度,表示转换后输出字符串的最小宽度;
  6. precision:精度,前面有一个点号" . "
  7. length:长度修饰符;
  8. type:转换类型,指定待转换数据的类型。(必选)
  9. 例子:
  10. int a = 0, b = 0, c = 0;
  11. char buf[50] = {0};
  12. printf("%d (%s) %d (%s)\n", 520, "Tux", 1314, "xuT");
  13. fprintf(stdout, "%d (%s) %d (%s)\n", 520, "Tux", 1314, "xuT");
  14. dprintf(STDOUT_FILENO, "%d (%s) %d (%s)\n", 520, "Tux", 1314, "xuT");
  15. sprintf(buf, "%d (%s) %d (%s)\n", 520, "Tux", 1314, "xuT");
  16. printf("%s", buf);
  17. memset(buf, 0x00, sizeof(buf));
  18. snprintf(buf, sizeof(buf), "%d (%s) %d (%s)\n", 520, "Tux", 1314, "xuT");
  19. printf("%s", buf);
  20. exit(0);

格式化I/O:格式化输入

  1. #include <stdio.h>
  2. //scanf()函数可将用户输入(标准输入)的数据进行格式化转换
  3. int scanf(const char *format, ...);
  4. //fscanf()函数从 FILE 指针指定文件中读
  5. 取数据,并将数据进行格式化转换
  6. int fscanf(FILE *stream, const char *format, ...);
  7. //sscanf()函数从参数 str 所指向的字符串中读取数据,并将数据进行格式
  8. 化转换。
  9. int sscanf(const char *str, const char *format, ...);
  10. 例子:
  11. int a, b, c;
  12. scanf("%d %d %d", &a, &b, &c);
  13. int a, b, c;
  14. fscanf(stdin, "%d %d %d", &a, &b, &c);
  15. char *str = "5454 hello";
  16. char buf[10];
  17. int a;
  18. sscanf(str, "%d %s", &a, buf);

fsync

fsync()函数,对目标文件的数据进行了同步操作,将参数 fd 所指文件的内容数据和元数据写入磁盘,只有在对磁盘设备的写入操作完成之后,fsync()函数才会返回。

  1. #include <unistd.h>
  2. int fsync(int fd);

fdatasync

:将参数 fd 所指文件的内容数据写入磁盘,并不包括文件的元数据;同样,只有在对磁盘设备的写入操作完成之后,fdatasync()函数才会返回
  1. #include <unistd.h>
  2. int fdatasync(int fd);

sync

将所有文件 I/O 内核缓冲区中的文件内容数据和元数据全部更新到磁盘设备中,该函数没有参数、也无返回值,意味着它不是对某一个指定的文件进行数据更新,而是刷新所有文件 I/O 内核缓 冲区。

  1. #include <unistd.h>
  2. void sync(void);

内核缓冲标志

  1. O_DSYNC:在调用 open()函数时,指定 O_DSYNC 标志,其效果类似于在每个 write()调用之后调用 fdatasync()函数进行数据同步。譬如:
  2. fd = open(filepath, O_WRONLY | O_DSYNC);
  3. O_SYNC:在调用 open()函数时,指定 O_SYNC 标志,使得每个 write()调用都会自动将文件内容数据和元数据刷新到磁盘设备中,其效果类似于在每个 write()调用之后调用 fsync()函数进行数据同步,譬如:
  4. fd = open(filepath, O_WRONLY | O_SYNC);

fileno

:将标准 I/O 中使用的 FILE 指针转换为文件 I/O 中所使用的文件描述符

  1. #include <stdio.h>
  2. int fileno(FILE *stream);

fdopen

:将 文件 I/O 中所使用的文件描述符转换成标准 I/O 中使用的 FILE 指针
  1. #include <stdio.h>
  2. FILE *fdopen(int fd, const char *mode);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/637792
推荐阅读
相关标签
  

闽ICP备14008679号