fcntl

文件IO(4)

余生长醉 提交于 2020-02-29 12:19:39
文件IO open()   头文件 #include<unistd.h> int open(const char *pathname,int flags); pathname:欲打开的文件路径 flags:文件打开方式 常用参数  头文件 #include<fcntl.h> O_RDONLY、O_WRONLY、O_RDWR O_APPEND、O_CREAT、O_EXCL、O_TRUNC、O_NUNBLOCK 返回值: 成功:打开文件所得到对应的文件描述符(整数) 失败:-1,设置error int open(const char *pathname,int flags,mod_t mode); pathname:欲打开的文件路径 flags:文件打开方式 常用参数 O_RDONLY、O_WRONLY、O_RDWR o_APPEND、O_CREAT、O_EXCL、O_TRUNC、O_NUNBLOCK mode:参数3使用的前提是 参数2指定了O_CREAT,取值为八进制数,用来描述文件的访问权限。 创建文件时,指定文件访问权限。权限同时受 umask 影响。结论为:文件权限 = mode & ~umask 返回值: 成功:打开文件所得到对应的文件描述符(整数) 失败:-1,设置error open常见错误: 打开文件不存在 以写方式打开只读文件(打开文件没有对应权限)

linux socket 阻塞非阻塞设置 fcntl,F_GETFL,F_SETFL,flags

痴心易碎 提交于 2020-02-24 08:52:27
1、获取文件的flags,即open函数的第二个参数: flags = fcntl(fd,F_GETFL,0); 2、设置文件的flags: fcntl(fd,F_SETFL,flags); 3、增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞: flags = fcntl(fd,F_GETFL,0); flags |= O_NONBLOCK; fcntl(fd,F_SETFL,flags); 4、取消文件的某个flags,比如文件是非阻塞的,想设置成为阻塞: flags = fcntl(fd,F_GETFL,0); flags &= ~O_NONBLOCK; fcntl(fd,F_SETFL,flags); 获取和设置文件flags举例:: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <error.h> char buf[500000]; int main(int argc,char *argv[]) { int ntowrite,nwrite; const char *ptr ; int flags; ntowrite = read(STDIN_FILENO,buf,sizeof(buf)); if(ntowrite <0) {

fcntl函数,fcntl 模拟dup和dup2,fcntl补设O_APPEND文件状态标志(文件IO)【linux】(m)

别来无恙 提交于 2020-02-04 23:51:40
fcntl函数,fcntl 模拟dup和dup2,fcntl补设O_APPEND文件状态标志 fcntl函数 函数原型 功能 返回值 参数 fcntl来补设文件状态标志 fcntl 模拟dup和dup2 模拟dup 模拟dup2 fcntl补设O_APPEND文件状态标志 ioctl函数提出 fcntl函数 我们可以通过帮助手册查看fcntl函数的详细信息: 函数原型 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd, ... /* arg */ ); 我们可以看到,在函数参数有: … /* arg */ 的形式说明函数参数有时候使用,有的时候不使用。 功能 fcntl函数是File Control的缩写,通过fcntl可以设置、或者修改已打开的文件性质。 返回值 调用成功:返回值视具体参数而定,这个后面还会再介绍 调用失败:返回-1,并把错误号设置给errno。 参数 int fcntl(int fd, int cmd, … /* arg */ ); 1)fd:指向打开文件 2)cmd:控制命令,通过指定不同的宏来修改fd所指向文件的性质。(a)F_DUPFD 复制描述符,可用来用来模拟dup和dup2,后面会有例子对此用法进行说明。 返回值:返回复制后的新文件描述 (b)F_GETFL、F

文件I/O

岁酱吖の 提交于 2020-01-26 03:02:09
目录: 1、文件I/O 1.1 ---- C标准函数与系统函数的区别 1.2 ---- PCB概念 1.3 ---- open/close 1.4 ---- read/write 1.5 ---- 阻塞和非阻塞 1.6 ---- lseek 1.7 ---- fcntl 1.8 ----ioctl 1.1 C标准函数与系统函数的区别 有一定编程基础的小伙伴应该都接触过文件编程吧,file. 在C语言里面是包一个<file.h>的头 每一个文件都有一个缓冲区,C和系统函数的区别也不想说太多,系统函数可以实现不同进程共享一个缓冲区,而C函数不行。 1.2 PCB的概念 PCB(process control block),进程控制块。 Linux的进程控制块为一个由结构task_struct所定义的数据结构,task_struct存/include/ linux/sched.h 中,其中包括管理进程所需的各种信息。 在创建一个新进程时,系统在内存中申请一个空的task_struct区,即空闲PCB块,并填入所需信息。 1.3 open/close 首先了解一下文件描述符,和文件描述符表。 注意:以下内容记住基于进程,所以文件描述符和符表都存在PCB里面了。 文件描述符表:纪录文件描述符使用情况的表。 文件标书符:在一个进程创建时吗,默认自动打开三个文件,即生成了三个文件描述符:

网络I/O模型--5种常见的网络I/O模型

爱⌒轻易说出口 提交于 2020-01-17 06:51:34
阻塞与非阻塞   阻塞就是卡在那儿什么也不做,双方之间也没有信息沟通。   非阻塞就是即使对方不能马上完成请求,双方之间也有信息的沟通。 同步与异步   同步就是一件事件只由一个过程处理完成,不论阻塞与非阻塞,最后完成这个事情的都是同一个过程   异步就是一件事由两个过程完成,前面一个过程通知,后面一个过程接受返回的结果。 异步和事件驱动(multi IO)   异步是指数据准备好并且已经拷贝到用户空间,在通知用户来取数据 事件驱动理解为准备好数据了但是没有拷贝到用户空间,这个时候去通知用户,用户再去取数据,经过拷贝过程取得数据。 5种常见的网络I/O模型 blocking I/O -- 阻塞类型的I/O nonblocking I/O -- 非阻塞类型的I/O I/O Multiplexing -- 多路复用型I/O  Signal-Driven I/O -- 信号驱动型I/O Asynchronous I/O -- 异步I/O       1. blocking I/O -- 阻塞类型的I/O   流程图如下:        linux下socket默认是阻塞的,阻塞模式在准备数据和拷贝数据两个过程都是阻塞的,在这期间客户端一直卡着,双方也没有数据交流。 2.nonblocking I/O -- 非阻塞类型的I/O   流程图:       

进程间锁

帅比萌擦擦* 提交于 2020-01-15 01:30:29
目录 15.1 进程间pthread_mutex 15.2 文件锁 15.1 进程间互斥锁 直接上原语吧: # include <pthread.h> int pthread_mutexattr_init ( pthread_mutexattr_t * attr ) ; int pthread_mutexattr_destroy ( pthread_mutexattr_t * attr ) ; int pthread_mutexattr_setpshared ( pthread_mutexattr_t * attr , int pshared ) ; pshared : PTHREAD_PROCESS_PRIVATE:线程锁 PTHREAD_PROCESS_SHARED:进程锁 示例代码: /* 互斥量 实现 多进程 之间的同步 */ # include <unistd.h> # include <sys/mman.h> # include <pthread.h> # include <sys/types.h> # include <sys/wait.h> # include <fcntl.h> # include <string.h> # include <stdlib.h> # include <stdio.h> struct mt { int num ; pthread

UNIX环境高级编程 第三章 文件I/O

回眸只為那壹抹淺笑 提交于 2020-01-14 02:48:55
UNIX环境高级编程——文件I/O 3.1 文件描述符 3.2 函数open和openat 参数 path: oflag: fd: 文件名和路径名截断 3.3 函数creat 3.4 函数close 3.5 函数lseek 3.6 函数read 3.7 函数write 3.8 I/O的效率 3.9 文件共享 3.10 原子操作 函数pread和pwrite 3.11 函数dup和dup2 3.12 函数sync、fsync和fdatasync 3.13 函数fcntl 3.14 函数ioctl 3.15 /dev/fd 3.1 文件描述符 作用:唯一表示一个文件(unix中设备也被看作文件) 当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。 文件描述符的范围:0~OPEN_MAX-1 标准shell建立的文件描述符关联: STDIN_FILENO (文件描述符:0):标准输入 STDOUT_FILENO (文件描述符:1):标准输出 STDERR_FILENO (文件描述符:2):标准错误 3.2 函数open和openat 利用open或openat函数可以打开或创建一个文件 # include <fcntl.h> int open ( const char * path , int oflag , . . . . ) ; int openat ( int

How to lock and unlock pid file with “fcntl()”

旧城冷巷雨未停 提交于 2020-01-11 09:10:53
问题 I make a reseach on the net and even on the stackoverflow inorder to find an example of using fcntl() to lock and unlock pid file "/var/run/myapp.pid" but I did not find a clear example for that. Could you point me to an example using fcntl() to lock and unlock pid file? The lock should not be blocked (if the file is alredy locked) 回答1: As you tagged Linux, verbatim form man lockf (emphasis by me): On Linux, lockf () is just an interface on top of fcntl (2) locking . Many other systems

Python3脚本单进程实例实现

空扰寡人 提交于 2019-12-28 09:34:20
一、说明 一方面,前边写了“ Linux shell脚本单实例模式实现 ”,python也是日常需要使用的,所以也想来看python中如何实现。 另一方面,shell中没有类和实例的概念,所以我以为“单进程实例”和设计模式中的“单例模式”是一个意思,但实际来看还是有些差别的。 “单进程实例”要求的是在整个内存中,一个文件只有一个进程实例。“单例模式”能保证的是类只有一个实例,一是说他可能被同进程其他代码在多处调用、实例化然而他总是返回那一个实例,二是即便只有他一个文件一个类我们仍可以多次运行而效果只是一个进程中只有该类的一个实例。 或者用协议的级别进行类比,“单进程实例”和”单例模式“他们所处的层级是不一样的,“单进程实例”是整个内存级,“单例模式”是整个进程级。 二、Linux平台实现--使用标准库fcntl linux平台可以通过python标准库fcntl来实现锁 import os import time import fcntl class Test(): # 此函数用于获取锁 def _get_lock(self): file_name = os.path.basename(__file__) # 为了统一按linux的习惯放到/var/run目录去 lock_file_name = f"/var/run/{file_name}.pid" #

File r/w locking and unlink

不羁的心 提交于 2019-12-25 00:36:20
问题 I have following problem. I want to create a file system based session storage where each session data is stored in simple file named with session ids. I want following API: write(sid,data,timeout) , read(sid,data,timeout) , remove(sid) where sid==file name, Also I want to have some kind of GC that may remove all timed-out sessions. Quite simple task if you work with single process but absolutly not trivial when working with multiple processes or even over NFS. The simplest solution I thought