系统调用&文件描述

一、系统调用

1、open打开文件

cpp 复制代码
#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>
int main()
{
    /*
    const char *__file 打开文件的路径
    int __oflag 打开文件的模式
    【1】O_RDONLY 只读模式
    【2】O_WRONLY 只写模式
    【3】O_RDWR 读写模式
    【4】O_CREAT 如果不存在创建文件
    【5】O_APPEND 追加写模式
    【6】O_TRUNC 截断文件长度为0
    ...可变参数:O_CREAT 创建文件的权限 0664
    return:文件描述符 如果打开文件失败返回-1 同时设置全局变量errno表示对应的错误
    int open(const char *__file, int __oflag, ...)
    */
    int fd=open("io1.txt",O_RDONLY | O_CREAT,0664);
    if (fd==-1)
    {
        printf("打开文件失败\n");
    }
    
    return 0;
}

MakeFile

cpp 复制代码
unistd_test:unistd_test.c
	-$(CC) -o $@ $^ 
	-./$@
	-rm ./$@

2、read

3、write

4、close

5、exit

6、练习

读取io.txt文件内容

cpp 复制代码
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
#include<stdio.h>

int main()
{
    //打开文件
    int fd = open("io.txt",O_RDONLY);
    if (fd == -1)
    {
        perror("open");
        exit(EXIT_FAILURE);
    }

    char *buf[1024];
    ssize_t bytes_read;
    bytes_read=read(fd,buf,sizeof(buf));
    if (bytes_read == -1)
    {
        perror("read");
        close(fd);
        exit(EXIT_FAILURE);
    }
    ssize_t bytes_write;
    while (bytes_read > 0)
    {
        bytes_write=write(STDOUT_FILENO,buf,bytes_read);
        bytes_read=read(fd,buf,sizeof(buf));
    }
    
    if (bytes_write == -1)
    {
        perror("write");
        close(fd);
        exit(EXIT_FAILURE);
    }
    close(fd);


    return 0;
}

Makefile

cpp 复制代码
system_call_test:system_call_test.c
	-$(CC) -o $@ $^
	-./$@
	-rm ./$@

二、文件描述符

1、定义

2、struct file

3、struct path

4、struct inode

5、文件描述符表关联的数据结构

6、文件描述符引用图解

相关推荐
NiceCloud喜云7 小时前
Anthropic 一周三连发:Cowork 多端、Fable 5 按需付费、J-space 论文的技术解读
java·服务器·网络·人工智能·ai
qeen878 小时前
【Linux】指令补充与shell的简单介绍
linux·运维·服务器
DLYSB_9 小时前
《从零开始搭建机房轻量化“声光告警”系统:基于 HTTP API 与 TTS 的运维实践》
运维·网络协议·http·报警灯
阿成学长_Cain9 小时前
Linux talk 命令详解:经典终端实时聊天工具,无需图形界面即可对话
linux·运维·前端
一拳一个娘娘腔9 小时前
【后渗透-Linux篇】Linux 提权与逃逸:从 www-data到 root的蜕变
linux·运维·服务器
jieyucx9 小时前
零基础通关:Shell 编程核心语法全景详解
linux·运维·编程·shell
杨运交9 小时前
[045][Crypto模块]设计一个可扩展的加解密框架:策略模式与工厂模式实战
linux·运维·策略模式
shx_wei9 小时前
从函数调用到进程替换:使用 execl、CMake 与 PowerShell 构建一个多可执行程序
linux·c语言·windows·c
Dlrb12119 小时前
信息查询Web服务器-->电子商城信息查询项目
linux·服务器·数据库·html·嵌入式·epoll·数据查询
纳兰青华10 小时前
在 PVE 上通过 LXC 部署 Ubuntu 24.04:为 OpenClaw 打造轻量高效的 AI 环境
linux·ai编程