一次重定向引起的异步IO

超声波法检测局部放电的原理与实现 摘要:超声波法通过捕捉局部放电产生的声波信号进行检测,系统由超声波传感器、信号调理单元和数据采集系统组成。其核心应用是局放源定位,主要采用时差定位法和声-电联合定位法。该方法具有抗电磁干扰强、定位精确等优点,但也存在信号衰减大、传播路径复杂等缺点,典型应用于变压器、GIS等设备的在线监测与故障诊断。 阅读详情

最近在用dup/dup2做IO重定向的时候,由于缓冲区的问题出现了一次异步IO,导致无法正常输出正确的结果。
先贴出代码:

/* 
 * 从文件里面读出1000个随机数,进行排序,再写到另一个文件中(使用dup/dup2)
 *  
 */

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char STR[32];

void quick(int *a, int i, int j);

int main(void)
{
    int fd, fd2;
    int save_fd, save_fd2;
    int i;

    if ((fd = open("data.txt", O_RDONLY)) < 0) {
        perror("open data.txt");
        exit(1);
    }

    if ((fd2 = open("sort_w.txt", O_RDWR|O_CREAT, 0644)) < 0) {
        perror("open sort_w.txt");
        exit(1);
    }

    save_fd = dup(STDIN_FILENO);
    save_fd2 = dup(STDOUT_FILENO);

    dup2(fd, STDIN_FILENO);
    dup2(fd2, STDOUT_FILENO);
 close(fd);
    close(fd2);

    STR *st = malloc(sizeof(STR) * 1000);
    memset(st, 0, sizeof(STR)*1000);

    int buf[1000] = {0};

    for (i = 0; i < 1000; i++)
        scanf("%s", st[i]);

    for (i = 0; i < 1000; i++)
        buf[i] = atoi(st[i]);

    quick(buf, 0, 999);

    char tmp[128] ={0};
    for (i = 0; i < 1000; i++) {
        memset(tmp, 0, 128);
        sprintf(tmp, "%d\n", buf[i]);

        /* error */
    //  printf("%s", tmp);             // apue 标准输出关联到一个文件的时候,变成全缓冲的。
        write(STDOUT_FILENO, tmp, strlen(tmp));
    }

    dup2(save_fd, STDIN_FILENO);
    dup2(save_fd2, STDOUT_FILENO);
    close(save_fd);
    close(save_fd2);

    free(st);
    return 0;
}


void quick(int *a, int i, int j)
{
    int m, n, temp;
    int k;
    m = i;
    n = j;
    k = a[(i + j) / 2]; /*选取的参照*/
    do {
        while (a[m]>k&&m<j) m++; /* 从左到右找比k大的元素*/
        while (a[n]<k&&n>i) n--; /* 从右到左找比k小的元素*/
        if (m <= n) { /*若找到且满足条件,则交换*/
            temp = a[m];
            a[m] = a[n];
            a[n] = temp;
            m++;
            n--;
        }
    } while (m <= n);
    if (m<j) quick(a, m, j); /*运用递归*/
    if (n>i) quick(a, i, n);
}

问题出在注释的printf那一行,用write一切正常运行,用printf的时候出现如下结果。

forker@L:homework$ ./a.out 
5
30094
29970
29882
29858
29769
29733
29690
29679
29673
29573
29434
29353
29309
29308
29269
29257
28751
28420
...
173

再来看看排序后生成的文件中:

673 30641
674 30637
675 30629
676 30628
677 30451
678 30401
679 30373
680 30364
681 30320
682 30199
683 3013

对比可以看出来,用printf在文件中写入了683行,并且没有写完,应该是30135,之后的数据打印到终端上。
后来,查阅资料Apue中说:
标准IO在关联到终端的时候是行缓冲的,在重将标准IO重定向到一个文件之后,这个时候就变成了全缓冲的。可以看到在第一次缓冲区满了的时候,IO例程进行刷新缓冲区,于是写入了文件。之后再将剩下的数据写到缓冲区,这个时候缓冲区并没有满,也就没有立刻刷新。接下来,标准IO又关联到终端,在进程终止之前,开始刷新缓冲区,于是剩下的数据被打印到终端上。
这里写图片描述

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版 Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。 立即下载

相关推荐

超详细 VMware Horizon 虚拟桌面VDI安装步骤

主要的目的是模拟生产环境中的共享存储。自动桌面相当于共享电脑,大家使用同一个虚拟机,对虚拟机的修改都放在用户的配置文件中,RDS桌面池相当于共享的服务器,可以多人同时连接到服务器上。1:之前已经建立好了NFS的存储,这部分配置好后,以后的虚拟机可以安装到NFS的存储中。2: 使用Composer发布系统可以解决SID,机器名冲突的问题,更重要的可以节约磁盘空间,发布的所有系统可以访问一块磁盘。26: 域选择我们之前建立的域,用户名我输入的是管理员,可以在AD域新建用户点击查找,我这里用的是管理员。

vv12345的博客 1万+

重定向与请求转发

现在,在登陆成功的时候,我们将请求转发给处理时间的Servlet,注意这里的路径规则和之前的不同,我们需要填写Servlet上指明的路径,并且请求转发只能转发到此应用程序内部的Servlet,不能转发给其他站点或是其他Web应用程序。请求转发其实是一种服务器内部的跳转机制,我们知道,重定向会使得浏览器去重新请求一个页面,而请求转发则是服务器内部进行跳转,它的目的是,直接将本次请求转发给其他Servlet进行处理,并由其他Servlet来返回结果,因此它是在进行内部的转发。

weixin_51992178的博客 904

RT-2(robotics-transformer2)论文--阅读笔记

谷歌RT-2机器人论文的阅读笔记。

weixin_61255639的博客 1830

转发重定向、异步同步

1.在请求和调用的概念中,何为同步,何为异步? 同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程; 异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。 区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。 2.软件系统B/S和C/S架构是什么,它们有什么区别 C/S是Client/Se...

tom_DT的博客 896

别再只调颜色阈值了!优化K210色块追踪性能的5个关键参数与实战技巧

本文深入探讨了K210色块追踪性能优化的五大核心策略,包括图像预处理参数精细调控、find_blobs参数进阶配置、运动控制算法升级、硬件时序优化以及可视化调试系统构建。通过实战技巧和参数调整方法,帮助开发者提升K210在色块追踪项目中的识别稳定性和响应速度,适用于云台追踪等应用场景。

weixin_42531588的博客 225

NXP KW45开发实战:如何在MCUXpresso IDE中正确配置J-Link并解决设备识别问题

本文详细介绍了在MCUXpresso IDE中配置J-Link以支持NXP KW45无线MCU开发的实战指南。从环境准备到J-Link深度配置,再到烧录流程优化和高级调试技巧,帮助开发者高效解决设备识别问题并提升开发效率。特别推荐使用JLinkRemoteServer.exe进行多设备并行调试,并提供了烧录速度优化和低功耗调试的实用技巧。

gray5的博客 864

转发和重定向有三个区别(关键有没有二次请求)

转发和重定向有三个区别(关键有没有二次请求): 转发地址栏不会变,重定向会 转发不会销毁request,可以传递request参数 转发只是原有的request请求上再做一次资源的跳转,所以不能访问外部资源,而重定向可以访问,例如 访问百度 如果需要传值,又需要重定向,那么用session存值。 session好比一个房间,request好比你在房间做的事情。 ...

建设美丽祖国 3684

南大计算机2024保研笔试:编译原理等5门专业课考点分布与408复习避坑指南

本文详细解析了南京大学计算机2024保研笔试的考点分布与复习策略,重点突出编译原理(占比28%-32%)和离散数学的特色考核。提供跨课程复习方法、真题题型分析及高效备考建议,帮助考生突破传统408框架,应对南大独特的命题风格。

weixin_29304985的博客 347

(req、resp、转发和重定向)day29javaEE基础查漏补缺

req、resp、转发和重定向1.后期所有东西都会放到web-inf下面(包括源码,页面,jar包等)2.获取请求头,可以用来做浏览器适配,和token3.再同一个项目下,表单的action可以省略ip和端口号4.表单数据,封装为对象,后期传参(传对象)方便。5.post请求乱码问题:6.转发的路径,就是servlet的虚拟路径。7.Request对象:是一个域对象,可以存储数据,一般用于在一次请求之间进行数据共享8.request生命周期9.请求转发也是一次请求,请求转发类似于代理模式吧,响应的其他ser

休哥哥的博客 1492

Ubuntu20.04安全重启后WiFi图标消失?MT7922网卡驱动修复全攻略

本文详细解析了Ubuntu20.04安全重启后WiFi图标消失的问题,特别是针对MT7922网卡驱动失效的情况。通过诊断命令和分步解决方案,包括禁用PCIe ASPM、更新无线固件和升级HWE内核,帮助用户快速恢复网络连接。文章还提供了进阶排查技巧和系统优化建议,确保WiFi稳定运行。

weixin_29202687的博客 370

24、JavaFX MP3 音频播放器开发详解

本文详细介绍了如何使用JavaFX开发一个功能丰富的MP3音频播放器,涵盖文件拖放加载、音频播放控制、音频频谱可视化、进度定位滑块等核心功能,并提供了完整的代码实现和解析。适合希望学习JavaFX多媒体应用开发的开发者参考。

wind6的博客 170

Python的异步文件IO操作

前一篇提到了用subprocess进行与应用的stdin和stdout交互,目前还是stdout处理得多。项目有这样的要求,需要代码能过同时在Linux和Windows下用,为防止应用挂起,需要进行异步IO操作,这样可通过timeout来处理超时。 麻烦问题又来了:Python2.7.x和Python3.2下的Popen都没有提供基于文件的异步IO操作,且项目必须使用Python2.x,应为较多

流浪的咖啡的专栏 5176

论文翻译:Automatic Lesson Plan Generation via Large Language Models with Self-critique Prompting

在本文中,我们利用大型语言模型(LLMs)的理解和生成能力来自动生成定制化的课程计划。这解决了传统计划可能无法充分满足不同教学环境和学生群体的特定需求的常见挑战。我们提出了一个新颖的三阶段过程,包括使用检索增强生成(RAG)逐步生成课程计划的每个关键组成部分,通过LLMs进行自我批评,以及随后的细化。我们使用这种方法为小学2至5年级生成了涵盖80多个主题的数学课程计划。邀请了三位经验丰富的教育工作者制定全面的课程计划评估标准,然后使用这些标准将我们的LLM生成的课程计划与同一主题的实际课程计划进行基准比较。

CSPhD-winston的博客 1103

java 异步请求重定向_java请求重定向

## 请求重定向 ##1、**请求重定向介绍流程**![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDgzODU4OQ_size_16_color_FFFFFF_t_70]2、**重定向特点**> a)浏览器地址栏会发生变化> ...

weixin_31100705的博客 525

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Vue的路由深入理解(重定向,嵌套,路由模式,异步)

目录标题路由嵌套 路由嵌套 嵌套路由又称子路由,在实际应用中,通常由多层嵌套的组件组合而成。同样地,URL 中各段动态路径也按某种结构对应嵌套的各层组件,例如: /user/foo/profile /user/foo/posts +------------------+ +-----------------+ | User | | User | | +--

david2000999的博客 1019

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux多线程编程----IO【select、poll、epoll】

IO操作多   速度就下降IO数据的 读和写IO的完成 必须等到 读事件(如磁盘 拷贝  每次要从磁盘查找数据) 和 写事件 (允许写 如写太快 写满就要马上阻塞)的就绪IO是否高效 :主要看一次IO中 等的时间的比例的多少 (等的时间比例越少  越高效) 就像钓鱼分两步:1 等 2 钓   (评价钓鱼技术高效 是 等的时间少 钓的次数多)5中IO模型1 阻塞式IO: 等的时候自己等   , 数据

城市猎人blog 1385

Devexpress16.2.6破解工具

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

传统IO(阻塞IO)

一、IO说明 按照POSIX的标准划分IO, 可以把IO分成两类:同步IO和异步IO 按照线程对IO业务的处理是否被阻塞的角度,可以将IO分成两类:阻塞IO和非阻塞IO (POSIX的标准 :UNIX系统的一个设计标准) 对于IO的操作步骤可以分成两步: 1、程序发出IO请求 2、完成实际的IO操作 阻塞IO和非阻塞IO 的划分标准是针对第一步来划分的(程序发出IO请求),如果发出IO请求会阻塞线程,就是阻塞IO;如果发出的IO请求没有阻塞IO,就是非阻塞IO ...

qinwenjng120的博客 990

五种IO模型

阻塞IO模型 在内核将数据准备好之前, 进程将会一直等待, 直到内核将数据全部准备好 非阻塞IO模型 如果数据还没有准备好, 内核将会向当前进程返回一个 EWOULDBLOCK 错误码, 同时当前进程会不断的进行返回, 轮询式的取检查是否有数据准备好 信号驱动模型 要想实现信号驱动模型, 必须在之前给当前进程注册一个 SIGACTION 信号, 然后返回, 当内核中数据到达的时候...

qq_41027326的博客 280

【linux】高级IO,认识五种IO模型,非阻塞IO的实现,fcntl

一、前置知识 二、五种IO模型 三、深入认识五种IO模型 阻塞IO 非阻塞IO 信号驱动IO 多路转接 异步IO 四、非阻塞IO的实现 fcntl

重铸自身根基的博客 1209

转发和重定向_Rinetd:一个用户端口重定向工具

概述Rinetd 是一个 TCP 连接重定向工具,当我们需要进行流量的代理转发的时候,我们可以通过该工具完成。Rinetd 是一个使用异步 IO 的单进程的服务,它可以处理配置在 /etc/rinetd.conf 中的任意数量的连接,但是并不会过多的消耗服务器的资源。Rinetd 不能用于重定向 FTP 服务,因为 FTP 服务使用了多个 socket 进行通讯。如果需要 Rinetd 随系统启动...

weixin_39699670的博客 340

Linux文件IO深度精讲,系统IO与标准IO、缓冲区机制、文件描述符、文件重定向、读写高阶实战与工程性能优化

我们完成了Linux进程生命周期、五大IPC通信、信号异步机制全套体系,彻底搞懂了进程如何创建、如何通信、如何异步响应事件。而进程运行的最终目的,大多离不开数据的读取、处理与持久化落地,这一切的底层支撑就是Linux文件IO机制。Linux秉承「一切皆文件」的核心设计哲学,磁盘文件、日志、终端、管道、Socket网络连接、硬件设备,全部以文件形式统一管理,依托一套IO读写体系完成数据交互。可以说,不懂Linux文件IO,就看不懂日志落地、缓存读写、服务持久化、网络传输的底层逻辑。很多开发者长期混淆。

2401_86195313的博客 299

IO模型

一、IO说明 按照POSIX的标准划分IO, 可以把IO分成两类:同步IO和异步IO 按照线程对IO业务的处理是否被阻塞的角度,可以将IO分成两类:阻塞IO和非阻塞IO (POSIX的标准 :UNIX系统的一个设计标准) 对于IO的操作步骤可以分成两步: 1、程序发出IO请求 2、完成实际的IO操作 阻塞IO和非阻塞IO 的划分标准是针对第一步来划分的(程序发出IO请求),如果发出IO请求会阻塞线程,就是阻塞IO;如果发出的IO请求没有阻塞IO,就是非阻塞IO 举例:传统...

qinwenjng120的博客 298

java 异步请求重定向_JavaEE通过response实现请求重定向

请求重定向指的是一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。302状态码和location头即可实现重定向。请求重定向最常见的应用场景就是用户登录。 下面的示例代码从另一个页面重定向到用户登录页面:复制代码代码如下:package com.yyz.response;import java.io.IOException;import javax.servl...

weixin_39964391的博客 158

一行代码解决Vue异步路由刷新后404的问题

背景 /home:项目首页,同步路由 /uc/profile:个人信息页,异步路由,登录后根据用户角色展示。 /login?redirect=%2Fuc%2Fprofile(%2F是/ 的url转义) :登录页,同步路由,在个人信息页退出登录会进入登录页并携带redirect=/uc/profile,再次登录成功后,直接进入个人信息页 项目:基于vue-element-admin,对权限菜单,异步路由,Mock文件都已经写好了。只需要根据需求修改就可以! 最开始项目没有配置重定向404..

Moon Star 8209

Linux IO模型

一 . 前言 每次说nginx为什么快时,都总会提到“nginx因为使用‘异步、非阻塞、IO多路复用’,所以nginx很快且能扛住高并发……”。那么什么是IO模型呢?有分同步和异步、阻塞和非阻塞,这其中有什么区别呢? 二. Linux IO模型是什么? 在了解Linux IO 之前先记住下面这点 Linux文件系统一切都是文件 2.1文件描述符(fd) 文件分为普通文件,目录文件,设备文件,连接文件等,Linux在操作文件时,都是通过文件描述符(文件描述符是相当于Linux Kernel对文件创建的索引

zpsimon的博客 205

面试问题4IO网络编程

学习笔记 IO按流向分 输入流:InputStream 输出流:OutputStream 按处理单元来分 字节流:InputStream,OutputStream(所有文件都能够处理) FileInputStream,FileOutputStream ByteArrayInputStream,ByteArrayOutputStream BufferedInputStream,BufferedOut...

旭旭1998的博客 6万+
上一篇: django1.8使用mysql数据库
下一篇: 数组与指针1
Linux_forker
博客等级 码龄11年 3粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值