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的更多相关文章

  1. Linux系统编程@进程通信(一)

    进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...

  2. Linux C 程序 文件操作(Linux系统编程)(14)

    文件操作(Linux系统编程) 创建一个目录时,系统会自动创建两个目录.和.. C语言实现权限控制函数 #include<stdio.h> #include<stdlib.h> ...

  3. Linux系统编程【转】

    转自:https://blog.csdn.net/majiakun1/article/details/8558308 一.Linux系统编程概论 1.1 系统编程基石 syscall: libc:标准 ...

  4. linux系统编程:cp的另外一种实现方式

    之前,这篇文章:linux系统编程:自己动手写一个cp命令 已经实现过一个版本. 这里再来一个版本,涉及知识点: linux系统编程:open常用参数详解 Linux系统编程:简单文件IO操作 /*= ...

  5. linux系统编程(一)概述

    glibc库封装了linux系统调用,并提供c语言接口 所以学习linux系统编程,主要参考glibc库系统调用相关api 一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 ...

  6. linux系统编程之管道(三)

    今天继续研究管道的内容,这次主要是研究一下命名管道,以及与之前学过的匿名管道的区别,话不多说,进入正题: 所以说,我们要知道命名管道的作用,可以进行毫无关系的两个进程间进行通讯,这是匿名管道所无法实现 ...

  7. linux系统编程之信号(七)

    今天继续学习信号,主要是学习关于时间和定时器相关的函数的使用,关于这个实际上有很多内容,这里先简要进行说明,等之后再慢慢进行相关深入,也主要是为接下来要做的一个综合linux系统编程的例子做准备,好了 ...

  8. linux系统编程之进程(一)

    今天起,开始学习linux系统编程中的另一个新的知识点----进程,在学习进程之前,有很多关于进程的概念需要了解,但是,概念是很枯燥的,也是让人很容易迷糊的,所以,先抛开这些抽象的概念,以实际编码来熟 ...

  9. linux系统编程之文件与io(五)

    上一节中已经学习了文件描述符的复制,复制方法有三种,其中最后一种fcntl还并未使用到,关于这个函数,不光只有复制文件描述符的功能,还有其它一些用法,本节就对其进行一一剖析: fcntl常用操作: 这 ...

随机推荐

  1. 更改Windows更新源(解决公司内部网络无法下载语言包或更新的问题)

    打开注册表 找到HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate 将WUServer.WUStatusServe ...

  2. vue+koa实现简单的图书小程序(3)

    实现一个今年过了多少天的组件的记录我们使用了原生的微信小程序开发文档里的组件 “Progress” 并不需要自己去写: https://developers.weixin.qq.com/minipro ...

  3. SAMTOOLS使用 SAM BAM文件处理

    [怪毛匠子 整理] samtools学习及使用范例,以及官方文档详解 #第一步:把sam文件转换成bam文件,我们得到map.bam文件 system"samtools view -bS m ...

  4. Spring事务管理transactionManager

    bean.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http ...

  5. erlang开发工具之intellij idea基本使用

    其他废话就不多说了,接下来主要是介绍怎么来用idea搭建项目让我们能更好的使用好开发工具. (这边假设你已经下载好了intellij idea关于erlang的插件,如果没有安装好,请先去google ...

  6. kafka工作原理介绍

    两张图读懂kafka应用: Kafka 中的术语   broker:中间的kafka cluster,存储消息,是由多个server组成的集群.  topic:kafka给消息提供的分类方式.brok ...

  7. 打印sql

    $query=$sql->where([ 'test_id'=>24, 'name'=>'小洋' ]); //打印sql; $query->prepare(Yii::$app- ...

  8. mysql中文、英文别名排序问题,order by 关键字详解

    order by 关键字详解:   SELECT intcode AS 商品编码, product_title AS 名称, retailprice AS 零售价, purchaseprice AS ...

  9. 利用JQuery 解析MVC控制器传到前台的Json数据

    <script type="text/javascript"> function Getweb() { var name = $("#CityName&quo ...

  10. vue.js 精学记录

    v-bind:class使用的方式: 1.对象与法::class="{'active':isActive}" 此时当isActive为true时,会拥有active 2.数组语法: ...