Linux学习日记11——fcntl、lseek、传入传出参数

学习视频链接

黑马程序员-Linux系统编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1KE411q7ee?p=58&spm_id_from=pageDriver

目录

一、fcntl 函数

1.1 作用

1.2 查看函数介绍

1.3 测试运行

二、lseek 函数

2.1 函数简介

2.2 测试运行

2.4 代码逻辑

2.5 应用场景

三、Linux 查看文件二进制形式

3.1 txt 文件

3.2 .c 文件

四、传入传出参数

4.1 传入参数

4.2 传出参数

4.3 传入传出参数


 

一、fcntl 函数

1.1 作用

改变一个已经打开的文件的访问控制属性

重点掌握两个参数的使用,F_GETFL 和 F_SETFL

 

1.2 查看函数介绍

1、man fcntl

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

2、fcntl

int flags = fcntl(fd, F_GETFL);

获取文件状态:F_GETFL

设置文件状态:F_SETFL

flags 的返回值为 -1 表示错误

 

flags 获取到了 fd 的权限的位图信息

 

3、位图

flags |= O_NONBLOCK 表示把位图中代表 O_NONBLOCK 的一位从 0 改为 1

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

使用 fcntl(fd, F_SETFL, flags) 函数再把原来的文件位图覆盖

 

位图的作用就是节约内存

 

1.3 测试运行

1、代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>

#define MSG_TRY "try again\n"

int main(void)
{
    char buf[10];
    int flags, n;

    flags = fcntl(STDIN_FILENO, F_GETFL);  // 获取stdin属性信息
    if (flags == -1) {
        perror("fcntl error");
        exit(1);  
    }

    flags |= O_NONBLOCK;

    int ret = fcntl(STDIN_FILENO, F_SETFL, flags);
    if (ret == -1) {
        perror("fcntl error");
        exit(1);
    }

tryagain:
    n = read(STDIN_FILENO, buf, 10);
    if (n < 0) {
        if (errno != EAGAIN) {
            perror("read /dev/tty");
            exit(1);
        }
        sleep(3);
        write(STDOUT_FILENO, MSG_TRY, strlen(MSG_TRY));
        goto tryagain;
    }
    write(STDOUT_FILENO, buf, n);

    return 0;
}

 

2、运行结果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

1.4 其他的补充

fcntl(fd, F_SETFD, FD_CLOEXEC);  // 这里设置为 FD_CLOEXEC 表示当程序执行 exec 函数时本 fd 将被系统自动关闭,表示不传递给 exec 创建的新进程,如果设置为 fcntl(fd, F_SETFD, 0); 那么本 fd 将保持打开状态复制到 exec创建的新进程中

 

二、lseek 函数

2.1 函数简介

1、off_t lseek(int fd, off_t offset, int whence)

 

2、参数

fd:文件描述符

offset:偏移量

whence:起始偏移量:SEEK_SET/SEEK_CUR/SEEK_END

 

3、返回值

成功:较起始位置偏移量

失败:-1 errno

 

2.2 测试运行

1、代码

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

2、运行

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_17,color_FFFFFF,t_70,g_se,x_16

 没有写出相应的内容

 

3、修改代码

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_18,color_FFFFFF,t_70,g_se,x_16

 

2.4 代码逻辑

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

执行了写操作,读写指针的位置指向了最后。现在使用 lseek 把读写指针指向了开头,我们又能使用读写指针来读内容。

 

2.5 应用场景

(1) 文件的 “读”、“写”使用同一偏移位置

(2) 使用 lseek 获取文件大小

(3) 使用 lseek 拓展文件大小,想要使得文件大小真正的拓展,必须引起 IO 操作

 

1、获取文件大小

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_16,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_18,color_FFFFFF,t_70,g_se,x_16

 

2、lseek 拓展文件大小

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_14,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_18,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 ^@:相当于文件空洞,二进制形态为 "\0"

如果编写的时候编程这样也是可以的 write(fd, "\0", 1);

 

3、二进制形式查看

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_19,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

4、另一个用于拓展的函数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 执行成功返回 0,并且源文件从 0 字节拓展到 250 字节了

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

三、Linux 查看文件二进制形式

3.1 txt 文件

6f —> o

e883 —> 胡

a1e5 —> 安

0a —> 换行

20 —> 空格

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

3.2 .c 文件

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

四、传入传出参数

4.1 传入参数

1、指针作为函数参数

2、同常有 const 关键字修饰

3、指针指向有效区域,在函数内部做读操作  

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

4.2 传出参数

1、指针作为函数参数

2、在函数调用之前,指针指向的空间可以无意义,但必须有效

3、在函数内部,做写操作

4、函数调用结束后,充当函数返回值

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

4.3 传入传出参数

1、指针作为函数参数

2、在函数调用之前,指针指向的空间有实际意义

3、在函数内部,先做读操作,后做写操作

4、函数调用结束后, 充当函数返回值

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVyYi5kcg==,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Linux中的fcntl是一个系统调用函数,用于对文件描述符进行控制操作。它可以实现文件锁定、非阻塞I/O、修改文件状态标志等功能。fcntl函数可以在多线程和多进程环境下使用,是Linux系统中非常重要的一个函数。 ### 回答2: fcntl是一个系统调用函数,用于对文件描述符进行管理和操作。它可以实现文件的获取、修改和设置等操作,可以用于改变文件的属性、非阻塞I/O、文件锁等。 在Linux中,fcntl函数主要有以下几个常用的功能: 1. 复制文件描述符:通过fcntl可以复制一个文件描述符,并返回一个新的文件描述符。这个功能可以在多线程和多进程的编程中使用,以便同时对同一个文件进行操作。 2. 设置文件描述符标志:fcntl函数可以用来设置文件描述符的标志,如设置O_NONBLOCK标志,即实现非阻塞I/O操作。这在异步I/O和事件驱动编程中非常常见,可以提高程序的性能和响应速度。 3. 获取和设置文件状态标志:通过fcntl函数可以获取和设置文件的状态标志,如是否为非阻塞模式、是否为追加模式等。这些标志可以决定文件的默认行为和特性。 4. 获取和设置文件锁:fcntl函数可以获取和设置文件锁,用于实现多进程或多线程对同一个文件的互斥访问。通过文件锁可以保证对文件的操作的原子性和互斥性。 总之,fcntl函数在Linux中是一个非常重要和有用的系统调用函数,可以实现对文件描述符的管理和操作。它可以用于复制文件描述符、设置文件描述符标志、获取和设置文件状态标志以及实现文件锁等功能,提供了对文件的灵活和全面控制。 ### 回答3: fcntlLinux系统中的一个系统调用,用于对文件描述符进行控制操作。它可以实现多种功能,如设置、获取和修改文件描述符的属性。 fcntl函数接受三个参数:fd(文件描述符),cmd(控制命令)和arg(可选参数)。 - fd:要控制的文件描述符,可以是打开文件、socket连接或其他类似对象的文件描述符。 - cmd:控制命令,用于指定对文件描述符进行的具体操作,例如设置文件描述符为非阻塞模式、获取文件状态标志等。 - arg:可选参数,用于一些特定控制命令的参数传递。 fcntl函数的一些常用控制命令包括: - F_DUPFD:复制文件描述符,并返回一个新的文件描述符。 - F_GETFL:获取文件状态标志。 - F_SETFL:设置文件状态标志。 - F_GETLK:获取文件记录锁。 - F_SETLK:设置文件记录锁。 - F_SETLKW:设置文件记录锁,如果不能立即获取则等待。 fcntl函数的具体使用方式和行为取决于传入的控制命令和参数。例如,通过设置cmd为F_SETFL,可以修改文件描述符的状态标志,如设置为非阻塞模式,从而实现非阻塞I/O操作。而通过设置cmd为F_GETLK,可以获取文件描述符的记录锁信息。 总结来说,fcntlLinux系统中用于控制文件描述符的系统调用,通过不同的控制命令实现文件描述符的各种操作,包括设置属性、获取状态、设置锁等。在Linux开发中,fcntl函数常用于实现对文件和网络连接的高级控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

herb.dr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值