系统函数、系统调用

系统函数

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. CSS - 表格细线边框

    通过 border-collapse: collapse cellpadding="0", cellspacing= "0" 实现 <!DOCTYPE h ...

  2. unity 热更方案对比

    现在一般使用的方案有:tulua&ulua.xlua.ILRuntime 对比: tulua&ulua 方案成熟,稳定第三方库支持 xlua 之前是为了热更修复线上bug的,腾讯发起的 ...

  3. PAT T1008 Airline Routes

    用tarjan算法缩点~ #include<bits/stdc++.h> using namespace std; ; vector<int> g[maxn]; int N,M ...

  4. icos下配置snake test

    Topo: # $language = "Python" # $interface = "1.0"# Author:Bing Song# Date:6/21/2 ...

  5. c++特有的bool变量和用const定义变量

    写再最前面:摘录于柳神的笔记: bool 变量有两个值, false 和 true ,以前⽤C语⾔的时候都是⽤ int 的 0 和 1 表示 false 和 true 的,现在C++⾥⾯引⼊了这个叫做 ...

  6. ORACLE 判断首字母大小写问题

    1.对判断的字段进行拆分 select  substr(要区分的字段,0,1)  from 表 : 得到一个 首字母 2.对这个字符进行大小写判断 查出以小写字符为开头的 select  substr ...

  7. git - 节点树理解

    1.如下图 最左边黑色线是当前分支节点 每个点代表一次提交 2.当执行merge prd的时候 会把其他分支的节点都merge到你的分支同时产生右边的每条节点线. 3.每个版本都会与某条版本线上的一个 ...

  8. The way get information from mssql by using excel vba and special port

    Yes,  we can get information from mssql by using excel vba.  But the default port of MSSQL is  1433. ...

  9. SpringTest

    Spring Test 1.对junit的一个扩展   必须先导入junit jar包 2.简化获取bean的步骤 它的底层也是IOC容器 3.IOC的全部 junit的全部  junit的版本必须是 ...

  10. topthink/think-swoole 扩展包的使用 之 WebSocket

    嗯~ o(* ̄▽ ̄*)o,没错欢迎收看继续爬坑系列233...话不多说直接开撸 今天的题材是websocket,没有特殊说明的话默认环境都和此系列第一篇文章中申明一致,此后不再赘述. websocke ...