Linux系统编程——fcntl
fcntl可实现对指定文件描述符的各种操作,其函数原型如下:
int fcntl(int fd, int cmd, ... /* arg */ );
头文件
#include <unistd.h>
#include <fcntl.h>
操作类型由cmd决定,cmd的取值如下:
- F_DUPFD:复制文件描述符
- F_DUPFD_CLOEXEC:复制文件描述符,新文件描述符被设置了close-on-exec
- F_GETFD:读取文件描述标识
- F_SETFD:设置文件描述标识
- F_GETFL:读取文件状态标识
- F_SETFL:设置文件状态标识
- F_GETLK:如果已经被加锁,返回该锁的数据结构。如果没有被加锁,将l_type设置为F_UNLCK
- F_SETLK:给文件加上进程锁
- F_SETLKW:给文件加上进程锁,如果此文件之前已经被加了锁,则一直等待锁被释放。
下面举个例子:
我们知道如果read没有读到数据会阻塞,但加入NONBLOCK描述符后就不会阻塞。
read_stdin.c
#include <func.h>
void changeNonblock(int fd){
int status = fcntl(fd, F_GETFL);//先用F_GETFL拿出原有属性
status = status|O_NONBLOCK;//再加入非阻塞属性
fcntl(fd, F_SETFL, status);//重置属性
}
int main()
{
sleep(5);
char buf[128] = {0};
int ret;
changeNonblock(0);
ret = read(STDIN_FILENO, buf, sizeof(buf));
printf("ret = %d, buf = %s\n", ret, buf);
return 0;
}

在输入hello后过了几秒(五秒内),打印出结果并退出。
另外如果想清空所有文件描述符可以和自己的非按位与:
#include <func.h>
void changeNonblock(int fd){
int status = fcntl(fd, F_GETFL);
status = status|O_NONBLOCK;
fcntl(fd, F_SETFL, status);
}
void clr_flag(int fd){
int status = fcntl(fd, F_GETFL);
status &= ~status;//按位与清空文件描述符
fcntl(fd, F_SETFL, status);
}
int main()
{
//sleep(5);
char buf[128] = {0};
int ret;
//changeNonblock(0);
clr_flag(0);
ret = read(0, buf, sizeof(buf));
printf("ret = %d, buf = %s\n", ret, buf);
return 0;
}
Linux系统编程——fcntl的更多相关文章
- Linux系统编程@进程通信(一)
进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...
- Linux C 程序 文件操作(Linux系统编程)(14)
文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...
- Linux系统编程【转】
转自:https://blog.csdn.net/majiakun1/article/details/8558308 一.Linux系统编程概论 1.1 系统编程基石 syscall: libc:标准 ...
- linux系统编程:cp的另外一种实现方式
之前,这篇文章:linux系统编程:自己动手写一个cp命令 已经实现过一个版本. 这里再来一个版本,涉及知识点: linux系统编程:open常用参数详解 Linux系统编程:简单文件IO操作 /*= ...
- linux系统编程(一)概述
glibc库封装了linux系统调用,并提供c语言接口 所以学习linux系统编程,主要参考glibc库系统调用相关api 一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 ...
- linux系统编程之管道(三)
今天继续研究管道的内容,这次主要是研究一下命名管道,以及与之前学过的匿名管道的区别,话不多说,进入正题: 所以说,我们要知道命名管道的作用,可以进行毫无关系的两个进程间进行通讯,这是匿名管道所无法实现 ...
- linux系统编程之信号(七)
今天继续学习信号,主要是学习关于时间和定时器相关的函数的使用,关于这个实际上有很多内容,这里先简要进行说明,等之后再慢慢进行相关深入,也主要是为接下来要做的一个综合linux系统编程的例子做准备,好了 ...
- linux系统编程之进程(一)
今天起,开始学习linux系统编程中的另一个新的知识点----进程,在学习进程之前,有很多关于进程的概念需要了解,但是,概念是很枯燥的,也是让人很容易迷糊的,所以,先抛开这些抽象的概念,以实际编码来熟 ...
- linux系统编程之文件与io(五)
上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这 ...
随机推荐
- 进程PCB
struct task_struct { volatile long state; //说明了该进程是否可以执行,还是可中断等信息 unsigned long flags; //Flage 是进程号, ...
- 微信小程序调用快递物流查询API的实现方法
一. 创建index.wxml.index.wxss.index.js 附上代码: <view class='container'> <input class='info' plac ...
- AI五子棋第四周——接近尾声
欢乐时光过得特别快~ 真是快乐的一周,就是项目进展几乎纹丝不动. 燃尽图?? (添加了背景音乐,找到了一个很好的音乐素材网站!) (添加了俩图标:重开,和音乐.) (调了一下前后端通讯,基本能通话了, ...
- win11.2.0.4lsnrctl status hang
以前听客户说监听日志大于4G,监听出现问题.本次另一个客户也出现这个问题,表现为监听lsnrctl start,status长久hang住 匹配mos WINDOWS: Listener Hangs ...
- flume实现kafka到hdfs测试用例
kafka 到hdfs at1.sources =st1 at1.channels = ct1 at1.sinks = kt1 # For each one of the sources, the t ...
- ctrl+c以及写操作失败和flush
.kill命令可以带信号号码选项,也可以不带.如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源.也可以用kill向进程发送特定的信号 ...
- Filter用户例子
用Filter防止用户访问一些未被授权的资源,比如一个用户未登录就不允许访问网站的某些页面,并将页面重定向到需要用户登录的页面,下面是一个相关的例子: package com.drp.util.fil ...
- jQuery基础之一
jQuery基础之一 初识jQuery jQuery封装JavaScript中多个好用的函数成为并形成代码库,操作时也更符合我们的习惯,并且减少了浏览器之间的兼容性. jQuery官网 引入 本地 ...
- 个性化自己的DOS窗口
就是为了好看吧,感觉没啥大用 ============= 首先创建一个文本,写下如下命令 @echo off color D echo ======================== echo == ...
- python unittest框架
四个部分: test fixture A test fixture represents(代表) the preparation needed to perform one or more tests ...