Linux下的系统编程——系统调用(五)

news/2024/7/5 5:20:13

前言:

由操作系统实现并提供给外部应用程序的编程接口。(Application Programming Interface,API)。系统调用就是应用程序同系统之间数据交互的桥梁。

一、open/close函数

1.open函数:

    (1)int open(char *pathname, int flags)    #include <unistd.h>

    参数:
        pathname: 欲打开的文件路径名

        flags:文件打开方式:  #include <fcntl.h>

                 O_RDONLY|O_WRONLY|O_RDWR                    O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK ....

    返回值:
        成功: 打开文件所得到对应的 文件描述符(整数)

        失败: -1, 设置errno    

 

    (2)int open(char *pathname, int flags, mode_t mode)        123  775    

    参数:
        pathname: 欲打开的文件路径名

        flags:文件打开方式:    

                O_RDONLY|O_WRONLY|O_RDWR                    O_CREAT|O_APPEND|O_TRUNC|O_EXCL|O_NONBLOCK ....

        mode: 参数3使用的前提, 参2指定了 O_CREAT。    

                取值8进制数,用来描述文件的 访问权限。 rwx    0664

                创建文件最终权限 = mode & ~umask

    返回值:
        成功: 打开文件所得到对应的 文件描述符(整数)

        失败: -1, 设置errno    

2.close函数:

    int close(int fd);

3.错误处理函数:        

    与 errno 相关。

        printf("xxx error: %d\n", errno);

 

 

    char *strerror(int errnum);

        printf("xxx error: %s\n", strerror(errno));

    void perror(const char *s);

        perror("open error");

二、read/write函数:

1.read函数:

    ssize_t read(int fd, void *buf, size_t count);

    参数:
        fd:      文件描述符

        buf:    存数据的缓冲区

        count:缓冲区大小

    返回值:

        0:          读到文件末尾。

        成功;    > 0 读到的字节数。

        失败:    -1, 设置 errno

        -1: 并且 errno = EAGIN 或 EWOULDBLOCK, 说明不是read失败,而是read在以非阻塞方式读一个设备文件(网络文件),并且文件无数据。

 

2.write函数:

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

    参数:
        fd:     文件描述符

        buf:   待写出数据的缓冲区

        count:数据大小

    返回值:

        成功;    写入的字节数。

        失败:    -1, 设置 errno

示例:

用read和write函数实现cp操作(将open.c文件中的代码复制到open2.c中)

  1 #include <unistd.h>
  2 #include <fcntl.h>
  3 #include <stdlib.h>
  4 #include <pthread.h>
  5 #include <string.h>
  6 #include <stdio.h>
  7 
  8 int main(int argc,char *argv[])
  9 {
 10     char buf[1024];
 11 
 12     int n = 0;
 13 
 14     int fd1 = open(argv[1],O_RDONLY); //read
 15     if(fd1 == -1){
 16         perror("open argv1 error");
 17         exit(1);
 18     }
 19 
 20     int fd2 = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0664);
 21     if(fd2 == -1){
 22         perror("open argv2 error");
 23         exit(1);
 24     }
 25     while((n = read(fd1,buf,1024))!=0){
 26         if(n < 0)
 27         {
 28             perror("read error");
 29             break;
 30         }
 31         write(fd2,buf,n);
 32     }
 33 
 34     close(fd1);
 35     close(fd2);
 36 }
~                       

三、系统调用和库函数比较

预读入缓输出

 


http://lihuaxi.xjx100.cn/news/1490275.html

相关文章

freertos之队列集

队列集就是队列的集合 队列集的长度所包含队列的长度之和 实验 创建两个队列和一个队列集&#xff0c;并把队列添加到队列集&#xff0c;创建3个任务&#xff0c;其中两个任务往队列存数据&#xff0c;另一个任务通过队列集来获取数据。 实验结果&#xff1a;

Base64与cv2读取的图片,格式互转

Base64编码 Base64编码是一种将二进制数据转换为可打印字符的方式&#xff0c;以便在文本格式中传输或存储。它通常用于将二进制数据编码为ASCII字符串&#xff0c;以便在电子邮件、网页或XML文件中传输。 Base64编码的原理是将3个8位字节的数据&#xff08;即24位二进制数据…

nginx配置keepalive长连接

nginx之keepalive详解与其配置_keepalive_timeout_恒者走天下的博客-CSDN博客 为什么要有keepalive? 因为每次建立tcp都要建立三次握手&#xff0c;消耗时间较长&#xff0c;所以为了减少tcp建立连接需要的时间&#xff0c;就可以设置keep_alive长连接。 nginx中keep_alive对…

openCV实战-系列教程9:傅里叶变换(傅里叶概述/频域变换结果/低通与高通滤波)、原理解析、源码解读

OpenCV实战系列总目录 打印图像直接用这个函数&#xff1a; def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows()1、傅里叶变换 在生活中&#xff0c;我们的大部分事情都是以时间为参照的&#xff0c;用时间为参照的为时域分析&#xff0c;在频…

小小的消火栓 蕴藏着“大智慧”

2023年8月22日14时24分&#xff0c;天津消防救援总队指挥中心接到报警&#xff1a;天津市南开区万兴街道南京路新天地大厦外墙起火。接警后&#xff0c;总队立即调派23个消防站及南开、和平支队全勤指挥部&#xff0c;共计284名消防救援人员、62辆消防车赶赴现场。总队全勤指挥…

Java 基于 SpringBoot+Vue 的在线考试系统的研究与实现,2.0 版本

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 第一章第二章.主要技术第三章第四章 系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R图4.2.2 数…

通过类变量和方法返回数据

使用这种方法返回数据需要在调用start方法后才能通过类变量或方法得到数据。让我们先来看看例程2-13会得到什么结果。 package mythread;public class MyThread extends Thread { private String value1; private String value2; public void run() { …

40分钟的录课如何压缩为1GB?分享视频压缩方法

现在视频清晰度都很高&#xff0c;因此录制的视频大小也都超过了1GB&#xff0c;给我们的传输、存储带来了不便&#xff0c;如果想要将录制的课程压缩变小&#xff0c;可以通过视频压缩软件直接压缩、视频编辑软件调整分辨率等方式进行解决&#xff0c;下面就来看下具体的方法吧…