系统函数、系统调用

系统函数

open/close函数

函数原型

man 2 open

// open, creat - open and possibly create a file or device
// The argument flags must include one of the following access modes:
// O_RDONLY, O_WRONLY, or O_RDWR.
// 或者 O_APPEND O_CREAT O_EXCL O_TRUNC(清空文件)
int open(const char * pathname, int flags);
  • 头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
// --> 简写为
#include <unistd.h>
  • demo
#include <stdio.h>
#include <fcntl.h> // O_RDONLY的头文件
#include <unistd.h> int main()
{
int fd;
fd = open("./dict", O_RDONLY | O_CREAT);
// 创建文件指定权限,8进制数
fd = open("./dict", O_RDONLY | O_CREAT, 0644);
printf(fd);
close(fd);
return 0;
}

read/write函数

ssize read(int fd, void *buf, size_t count);
ssize write(int fd, const void *buf, size_t count);

read参数

  • fd:文件描述符
  • buf:存放数据的缓冲区
  • count:缓冲区的大小

read返回值:

  • success:读到的字节数
  • fail:-1,设置errno

write返回值:

  • success:写入的字节数

  • error:-1

实现cp

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h> int main(int argc, char *argv[])
{
char buf[1024];
int len = 0;
int fd1 = open(argv[1], O_RDONLY);
if(fd1 == -1)
{
perror("open argv1 error");
exit(1); // stdlib
}
// 打开文件,如果没有就创建,如有就清空
int fd2 = open(argv[2], O_RDWR | O_CREAT | O_TRUNC, 0664); while((len = read(fd1, buf, 1024))!=0)
{
if(len < 0)
{
perror("read error!");
exit(1);
}
write(fd2, buf, len);
} close(fd1);
close(fd2); return 0;
}

跟踪系统调用

$ strace ./readWrite
read(-1, 0x7ffd53164ea0, 1024) = -1 EBADF (Bad file descriptor)
write(3, "", 18446744073709551615) = -1 EFAULT (Bad address)
read(-1, 0x7ffd53164ea0, 1024) = -1 EBADF (Bad file descriptor)
write(3, "", 18446744073709551615) = -1 EFAULT (Bad address)
read(-1, 0x7ffd53164ea0, 1024) = -1 EBADF (Bad file descriptor)
write(3, "", 18446744073709551615) = -1 EFAULT (Bad address)
read(-1, 0x7ffd53164ea0, 1024) = -1 EBADF (Bad file descriptor)
write(3, "", 18446744073709551615) = -1 EFAULT (Bad address)

库函数

fopen/fclose

fgetc/fputc

FILE *fp, *fp_out;
int n;
fp = fopen("./dict.txt", "rw");
if (fp == NULL) { perror("fopen error");
exit(1);
}
fp_out = fopen("dict.cp", "w");
if (fp_out == NULL) {
perror("fopen error");
exit(1);
}
while ((n = fgetc(fp)) != EOF) {
fputc(n, fp_out);
}
fclose(fp);
fclose(fp_out);

文件描述符

文件描述符指向文件结构体.

PCB(进程控制块) :本质是结构体,成员是文件描述符,文件描述符:01/2/3...

一个进程快最多打开1024个文件,第一个文件是stdin, 2->stdout, 3 ->stderr

阻塞、非阻塞

阻塞:当读取设备文件、网络文件。读取常规文件不会阻塞。

设备目录:

  • /dev/tty 【终端设备】

阻塞示例:

void block() {
char buf[10];
// 读取是个字节
int n = read(STDIN_FILENO, buf, 10);
if (n < 0) {
perror("read STDIN_FILENOO");
exit(1);
}
write(STDOUT_FILENO, buf, 10);
}

当以非阻塞的方式读取文件(设备文件或者网络文件),并且文件为空时,open函数返回-1,并且将errno 设置为 EAGAIN or EWOULDBLOCK

tryagain:
n = read(fd, buf, 10);
if(n<0)
{
if(errno!= EAGAIN)
{
perror("read /dev/tty");
exit(1);
}
else
{
write(STDOUT_FILENO, "try again!", strlen("try again!"));
sleep(2);
goto tryagain;
}
}

IO、阻塞和非阻塞、目录的更多相关文章

  1. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  2. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  3. 网络IO之阻塞、非阻塞、同步、异步总结

    网络IO之阻塞.非阻塞.同步.异步总结 1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一 ...

  4. IO操作概念。同步、异步、阻塞、非阻塞

    “一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作. 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO. 阻塞IO和非阻塞IO的区别在于第 ...

  5. IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)

    IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇) 当你发现自己最受欢迎的一篇blog其实大错特错时,这绝对不是一件让人愉悦的事. <IO - 同步,异步,阻塞,非阻塞 >是我在开始学习e ...

  6. IO中同步、异步与阻塞、非阻塞的区别

    一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...

  7. IO同步、异步与阻塞、非阻塞

    一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...

  8. 阻塞与非阻塞IO step by step

    谈到IO,阻塞.非阻塞,异步.同步是绕不开的话题.说实话,我也没搞清楚,网上查了许多资料,大家众说纷纭,一种比较靠谱的说法是:”在处理 IO 的时候,阻塞和非阻塞都是同步 IO,使用使用了特殊的API ...

  9. 阻塞与非阻塞的IO网络读写

    看我之前的文章就知道,一般对于网络读的socket,都会加上O_NONBLOCK,非阻塞的选项. int setnonblocking(int fd) { int old_option = fcntl ...

随机推荐

  1. js判断对象中是否存在某一项和判断是否是对象

    1.判断是否为对象 let str = { name: '第一', age: 12 } console.log(typeof str== "object") 2.判断对象中是否有某 ...

  2. C#多态学习总结

    面向对象编程三大特点  封装 继承 多态.今天我把自己学习多态的过程进行总结 多态 就是 同一个方法在不同情况下,会表选不同的效果(多个形态).在代码上表现就是 同一个父类对象 赋予不同的子类对象 就 ...

  3. 寒假作业---蓝桥杯---DFS

    题目描述 现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: 每个方块代表1~13中的某一个数字,但不能重复. 比如: 6  + 7 = 13 9  - 8 = 1 3  * 4 = 12 10 ...

  4. SpringBoot 获得 properties 文件中数据方式

    参考:https://blog.csdn.net/qq_37171353/article/details/78005845

  5. 华为云WeLink 颠覆你对智能办公的想象

    导读 华为云发现,与企业数字化关系最紧密的就是办公数字化,所以将WeLink放到华为云上可以作为一个抓手让企业更直观地感受到云端数字化,而且华为云的合作伙伴,也可以与WeLink建立联接,从而进整个企 ...

  6. java获取指定月份有几个星期x,获取指定月份跨了多少个星期

    例如获取2020年5月一共有多少个星期二,一共跨了多少个星期 public class MainTest { public static void main(String[] args) throws ...

  7. Spring 各个组件架构

  8. 「BOI2007」Mokia

    「BOI2007」Mokia 传送门 把查询拆成四部分然后容斥计算答案(二维前缀和) 然后 \(\text{CDQ}\) 分治算答案. 参考代码: #include <algorithm> ...

  9. 133、Java获取main主函数参数

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  10. 使用oracle 的 PL/Sql 定时执行一个存储过程

    CSDN日报20170322--<关于软件研发的一些体会总结> 同步博客至 CSDN ,让更多开发者看到你的文章 看微博技术大咖解析互联网应用架构实战 使用oracle 的 PL/Sql ...