TLPI-Chapter 4文件IO

《unix环境高级编程》里面的outhdr.h 《unix环境高级编程》里面的几乎所有的程序都用到的ourhdr.h,亲测可以使用,需哟啊的下载 立即下载

所有执行I/O操作的系统调用都以文件描述符(一个非负整数)来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道、FIFO、socket、终端、设备、普通文件。它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。每个进程,文件描述符都自成一套。
三种标准的文件描述符:
0 标准输入 1 标准输出 2 标准错误
然后介绍执行文件IO操作的4个主要系统调用:
fd = open(pathname,flags,mode) 打开或创建一个新文件.

numread = read(fd,buffer,count) 读取fd所指代的文件中之多count字节的数据,并存储到buffer中.

numwritten = write(fd,buffer,count)调用从buffer中读取多达count字节的数据写入由fd指代的已打开的文件中.

status = close(fd)
释放文件描述符fd以及与之相关的内核资源.

改变文件偏移量:lseek()
off_t lseek(int fd, off_t offset, int whence)
offset参数指定了一个以字节为单位的数值
whence参数则表明赢参照哪个基点来解释offset参数,应为下列其中之一:
SEEK_SET:文件头部开始
SEEK_CUR:当前文件偏移量处
SEEK_END:文件结尾

.通用I/O模型以外的操作:ioctl()、fcntl()

ioctl()
ioctl()系统调用又为执行文件和设备操作提供了一种多用途机制。
int ioctl(int fd, int request,…);
request指定了将在fd上执行的控制操作
第三个参数…(argp)可以是任意数据类型,根据request的参数值来确定argp所期望的类型。通常情况,argp指向整数或结构的指针
fcntl()
fcntl()系统调用对一个打开的文件描述符执行一些列控制操作
int fcntl(intn fd, int cmd, …)
cmd参数所支持的操作范围很广
主要代码有两个:

#include <sys/stat.h>
#include <fcntl.h>
#include "tlpi_hdr.h"

#ifndef BUF_SIZE        /* Allow "cc -D" to override definition */
#define BUF_SIZE 1024
#endif

int
main(int argc, char *argv[])
{
    int inputFd, outputFd, openFlags;
    mode_t filePerms;
    ssize_t numRead;
    char buf[BUF_SIZE];

    if (argc != 3 || strcmp(argv[1], "--help") == 0)
        usageErr("%s old-file new-file\n", argv[0]);

    /* Open input and output files */

    inputFd = open(argv[1], O_RDONLY);
    if (inputFd == -1)
        errExit("opening file %s", argv[1]);

    openFlags = O_CREAT | O_WRONLY | O_TRUNC;
    filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |
                S_IROTH | S_IWOTH;      /* rw-rw-rw- */
    outputFd = open(argv[2], openFlags, filePerms);
    if (outputFd == -1)
        errExit("opening file %s", argv[2]);

    /* Transfer data until we encounter end of input or an error */

    while ((numRead = read(inputFd, buf, BUF_SIZE)) > 0)
        if (write(outputFd, buf, numRead) != numRead)
            fatal("couldn't write whole buffer");
    if (numRead == -1)
        errExit("read");

    if (close(inputFd) == -1)
        errExit("close input");
    if (close(outputFd) == -1)
        errExit("close output");

    exit(EXIT_SUCCESS);
}
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
#include "tlpi_hdr.h"

int
main(int argc, char *argv[])
{
    size_t len;
    off_t offset;
    int fd, ap, j;
    char *buf;
    ssize_t numRead, numWritten;

    if (argc < 3 || strcmp(argv[1], "--help") == 0)
        usageErr("%s file {r<length>|R<length>|w<string>|s<offset>}...\n",
                 argv[0]);

    fd = open(argv[1], O_RDWR | O_CREAT,
                S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |
                S_IROTH | S_IWOTH);                     /* rw-rw-rw- */
    if (fd == -1)
        errExit("open");

    for (ap = 2; ap < argc; ap++) {
        switch (argv[ap][0]) {
        case 'r':   /* Display bytes at current offset, as text */
        case 'R':   /* Display bytes at current offset, in hex */
            len = getLong(&argv[ap][1], GN_ANY_BASE, argv[ap]);

            buf = malloc(len);
            if (buf == NULL)
                errExit("malloc");

            numRead = read(fd, buf, len);
            if (numRead == -1)
                errExit("read");

            if (numRead == 0) {
                printf("%s: end-of-file\n", argv[ap]);
            } else {
                printf("%s: ", argv[ap]);
                for (j = 0; j < numRead; j++) {
                    if (argv[ap][0] == 'r')
                        printf("%c", isprint((unsigned char) buf[j]) ?
                                                buf[j] : '?');
                    else
                        printf("%02x ", (unsigned int) buf[j]);
                }
                printf("\n");
            }

            free(buf);
            break;

        case 'w':   /* Write string at current offset */
            numWritten = write(fd, &argv[ap][1], strlen(&argv[ap][1]));
            if (numWritten == -1)
                errExit("write");
            printf("%s: wrote %ld bytes\n", argv[ap], (long) numWritten);
            break;

        case 's':   /* Change file offset */
            offset = getLong(&argv[ap][1], GN_ANY_BASE, argv[ap]);
            if (lseek(fd, offset, SEEK_SET) == -1)
                errExit("lseek");
            printf("%s: seek succeeded\n", argv[ap]);
            break;

        default:
            cmdLineErr("Argument must start with [rRws]: %s\n", argv[ap]);
        }
    }

    if (close(fd) == -1)
        errExit("close");

    exit(EXIT_SUCCESS);
}
Linux/UNIX系统编程手册的支持代码 Linux/UNIX系统编程手册的支持代码,即tlpi_hdr.h,error_functions.h,get_num.c等在全文工程会用到的附带代码,以及第8.2部分/etc/passwd部分代码。 立即下载

相关推荐

机器学习ROC曲线中的阈值thresholds

在ROC曲线上的不同点对应于不同的阈值。根据任务的具体要求,可以选择合适的阈值,以达到平衡召回率和误报率,或者根据具体应用场景调整模型的工作点。,表示样本属于正例的概率。这个概率值可以被截断为二元分类的决策,通过选择一个阈值来决定样本是被分类为正例还是负例。通过改变阈值,可以得到不同的真正例率(TPR)和假正例率(FPR),从而绘制出ROC曲线。总体来说,ROC曲线提供了模型在不同阈值下的性能综合情况,帮助分析模型的分类能力。通常来说,随着阈值的增加,TPR会减小,而FPR会增加。ROC曲线的绘制涉及。

行子的博客 3654

tlpi_hdr.h头文件使用及设置

使用的头文件,主要如下: ename.c.inc error_functions.h get_num.h tlpi_hdr.h 其中ename.c.inc文件定义了一个字符串数组,用于对应错误码的名称。 error_functions.h文件声明了本书自定义的错误处理函数。 get_num.h文件声明了本书自定义的数值提取函数。 tlpi_hdr.h文件则包含了后续需用到的系统调用头文件。 将头文件复制到默认的编译器寻找目录下,并将实现打包成静态库,然后使用别名来默认链接静态库。 具体操作如下: 第一步.

liao__ran的博客 1957

R语言的下载、安装及环境配置(Rstudio&VSCode)

R for Windows是一个免费的用于统计计算和统计制图的优秀工具,是R语言开发工具。它拥有数据存储和处理系统、数组运算工具(其向量、矩阵运算方面功能尤其强大)、完整连贯的统计分析工具、优秀的统计制图等功能。提供的图形界面,可以在其中访问控制台、创建脚本或安装其他软件包。

zegeai的博客 2万+

LinuxUNIX系统编程手册——(四)文件IO:通用的IO模型

所有执行 I/O 操作的系统调用都以文件描述符,一个非负整数(通常是小整数),来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道(pipe)、FIFO、socket、终端、设备和普通文件。大多数程序都期望能够使用 3 种标准的文件描述符,见下表。文件描述符用途POSIX名称stdio流0标准输入stdin1标准输出stdout2标准错误stderr。

hello_world0_0的博客 1152

ESP32-CAM与TFT屏幕实时图像传输:Arduino环境下的OV2640驱动实践

本文详细介绍了在Arduino环境下实现ESP32-CAM与TFT屏幕实时图像传输的完整实践方案。重点解析了OV2640摄像头的驱动配置、硬件引脚连接、TFT屏幕初始化及图像显示优化技巧,帮助开发者快速构建稳定的实时图像显示系统,适用于物联网监控、门禁系统等场景。

cuda7parallel的博客 115

导数与微分在 FPS 射击游戏中的实际应用:把“手感”算出来

摘要:射击游戏开发中,单线程适用于简单小游戏(如单机打靶),所有任务由主线程顺序处理,代码简单但效率较低;多线程则适合复杂场景(如多人在线3D大作),通过渲染、逻辑、网络、音效等线程分工协作,确保画面流畅、响应迅速和实时同步。选择依据取决于游戏复杂度、联网需求和性能要求,小型游戏用单线程,大型高要求项目必须采用多线程架构。(149字)

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 3278

4. 文件I/O:通用I/O模型

描述了基本文件I/O的概念。讲解了open, read, write, close, lseek 以及 ioctl基本函数

u010933311的博客 631

YOLOv8极速瘦身实战:LAMP剪枝让模型又快又准

一个庞大的模型虽然强大,但在实际部署,尤其是资源受限的边缘设备(如无人机、移动电话、嵌入式系统)上,却面临着严峻的挑战:高昂的内存占用、巨大的计算量以及随之而来的高延迟和高能耗。本教程从LAMP剪枝的深刻理论出发,详细解释了它如何通过最小化最坏情况下的L2失真,并借助巧妙的数学简化,最终推导出一种高效、无超参数、层自适应的剪枝策略。它如同为臃肿的模型进行一次精准的“瘦身手术”,通过移除网络中冗余或不重要的权重、神经元甚至整个结构,来显著降低模型的参数量和计算量(FLOPs),从而实现推理加速和资源节约。

FJN110的博客 258

板凳--------第20章-信号:基本概念1

信号是事件发生时对进程的通知机制,软件中断。信号与硬件中断的相似之处在于打断了程序执行的正常流程,无法预测信号到达的精确时间。一个具有权限的进程能够向另一进程发送信号。信号,一种同步技术,甚至是进程间通信( IPC)的原始形式。进程也可以向自身发送信号。然而,发往进程的诸多信号,通常都是源于内核。引发内核为进程产生信号的各类事件如下。1.硬件发生异常,即硬件检测到一个错误条件并通知内核,随即再由内核发送相应信号给相关进程。2.用户键入了能够产生信号的终端特殊字符。

fengye207161的博客 1307

RK3588, 绘制中文OSD,实现左右对齐

基于RK3588,实现中文OSD, 上下左右对齐。

J。 661

硬件测试实战笔记:SI/PI 到底测什么,怎么测?一文讲清

点选错了,数据越精确越误导。

qq_52293640的博客 254

c语言中pi怎么写头文件,tlpi_hdr.h头文件的使用以及配置

本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题。系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作,进行进程间的通信等。系统调用与C语言的函数调用类似。但是系统调用的过程比C语言函数调用复杂,开销也大得多。Linux 的系统调用通过 int 0x80 实现,用系统调用号来区分入口函数。操作系统实现系统...

weixin_35795512的博客 958

【Proteus仿真】点亮小灯系列仿真——小灯闪烁/流水灯/交通灯

本文介绍了基于AT89C51单片机的LED控制案例,共包含5个实例:1)单个LED闪烁;2)共阳极流水灯;3)共阴极流水灯;4)花样流水灯;5)交通灯模拟。每个案例详细说明了电路原理图、接线方式和控制程序实现,其中重点讲解了PWM调光原理及其在LED控制中的应用。案例由简至繁,从基础I/O控制到复杂花样显示,最后实现交通灯逻辑控制,展示了单片机在LED控制中的典型应用方法。文中提供了完整的源代码,便于读者理解和实践。

XU157303764的博客 1883

TLPI-Chapter 3系统编程概念

第三章内容概念讲的其实相对好理解,主要有如下几点: 系统调用是可控的内核入口,进程可以请求内核以自己的名义去执行某些动作,这就用到了系统调用,讲处理器从用户态切换到内核态。 在书中作者用到一个例子X86-32为例,按事件发生顺序: 1.应用程序通过外壳(wapper)函数,发起系统调用 2.参数入栈,传入外壳函数。 3.外壳函数将参数置入特定寄存器(包括系统调用编号) 4执行中断机器指令

尘世中迷途小书童 294

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C 语言套接字UDP机制实现

说明:此示例仅用于展示UDP的实现方法,仅供参考学习,没有实际使用功效。另外此实现分为服务器与客户机两部分代码,开发环境为GNU glibc_2.24,运行环境为Debian 9(linux)。 服务器端代码为: #include<tlpi_hdr.h> /*此头文件具体包含内容在本文最末尾列出*/ int main() { int sock_no; int return_s...

JmanCryTears的博客 367

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

linux下C通过系统调用进行基本IO操作

一.Linux下通过系统调用对普通文本文件进行I/O操作步骤: 调用open()获得一个文件描述符 利用获得的文件描述符作为read() 和write()的一个参数,进行I/O操作。 使用close()释放文件描述符及其相关资源。 文件描述符:一个非负整数(无符号整数),用于引用在内核中打开的文件。打开或创建一个文件时,内核返回一个文件描述符。读写一个文件时利用open、creat函数返回的文件描述

Try的博客 1787

linux系统编程手册错误,Linux系统编程手册 学习笔记(二)

第四章:文件I/O:通用的I/O模型在该章节中讨论的文件描述符的概念。其中包括:打开文件,关闭文件,从文件中读取数据和向文件中写数据。概述所有执行I/O操作的系统调用都以文件描述符(一个非负整数(通常是比较小的整数))来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道(pipe)、FIFO、socket、终端、设备和普通文件。下面介绍执行I/O操作的4个主要系统调用:open:fd...

weixin_39652658的博客 245

TLPI(liunx/unix系统编程手册)笔记(三) 文件IO:通用的IO模型

读下来总的就是介绍了四个IO的API--open,read,write,close。 大家都是知道的,everything is file,在linux系统里面一切都是看作文件来操作的,学习linux就得先学好文件IO,也可以看见TLPI这本书的介绍完一些概念之后就开始介绍文件IO了。 IO,大概的分为磁盘文件IO,buffering(缓冲)IO。貌似缓冲的水很深,之后会写博客。 ...

217

Linux系统编程错误处理函数

作为linux的菜鸟,最近在看《Linux/Uinx》系统编程手册,不得不说这是本很好很好的书。今天整理了一下在本书上册开始部分给出的错误处理函数如下,希望对大家有所帮助: //tlpi_hdr.h #ifndef TPLI_HDR_H #define TPLI_HDR_H /*Prevent accidental double inclusion*/ #include &amp;lt;sys/...

Walker-C 1364

The Linux Programming Interface 11 System Limits And Options 系统限制和选择

The Linux Programming Interface System Limit And Options (01) 概念 Each UNIX implementation set limits on various system features and resources, and provides - or chooses not to provide - options def

wangrl的博客 603

Linux系统编程手册 学习笔记(二)

第四章:文件I/O:通用的I/O模型 在该章节中讨论的文件描述符的概念。其中包括:打开文件,关闭文件,从文件中读取数据和向文件中写数据。 概述 所有执行I/O操作的系统调用都以文件描述符(一个非负整数(通常是比较小的整数))来指代打开的文件。文件描述符用以表示所有类型的已打开文件,包括管道(pipe)、FIFO、socket、终端、设备和普通文件。 下面介绍执行I/O操作的4个主要系统调...

Capr1corn的博客 1594

TLPI-Chapter 20 信号

基本概念信号是事件发生时对进程的通知机制。有时也称为软件中断,信号与硬件中断相似之处在于打断了程序执行的正常流程,大多数情况下,无法预测信号到达的精确时间。 一个具有合适权限的进程能够向另一进程发送信号,信号的这一用法可作为一种同步技术,甚至是进程通信IPC的原始形式。进程也可以向自身发送信号。然而发往进程的诸多信号,通常都是源于内核。 引发内核为进程产生信号的各类事件如下: 硬件发生异常:硬

尘世中迷途小书童 477

shell脚本判断文件是否存在

有一个需求是判断某一个目录下文件是否存在,如果该文件不存在,则从当前目录拷贝文件到该目录。 由于没有学习写过shell脚本,晚上下班回来搜索后写出了如下的脚本,这里shell的if语法格式与C语言大致相同,语法格式: if [ 条件 ]; then 条件成立 else 条件不成立 fi fi是结束if语句。version1.0#!/bin/sh myFile="/

尘世中迷途小书童 4万+

Sublime Text 3 for Mac 使用心得

本文是使用和学习Sublime Text 3 for Mac过程中的体会与心得,欢迎补充。 安装Package Control 安装过程: 使用快捷键 control + ` 或者菜单栏选择View > Show Console 安装Package Control参考官方页面. Sublime Text3在控制台输入 import urllib.request,os,hashlib; h

尘世中迷途小书童 2万+
上一篇: GCC编译链接多文件
下一篇: 细说指针
52coder
博客等级 码龄17年 87粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值