I/O重定向函数dup2

从标准输入拷贝一个文本文件到标准输出,使用dup2函数重定向到把一个磁盘文本文件拷贝到另一个磁盘文件的结尾处。

cpp 复制代码
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>

#define MAXBUF 20
#define DEF_MODE  S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH
#define DEF_UMASK S_IWGRP|S_IWOTH

ssize_t rio_readn(int fd, void *usrbuf, size_t n);
ssize_t rio_writen(int fd, void *usrbuf, size_t n);

int main(int argc, char **argv)
{
    int n,fd1,fd2;
    char buf[MAXBUF];

    fd1=open("hello.txt",O_RDONLY,0);
    umask(DEF_UMASK);
    fd2 = open("bar.txt", O_WRONLY|O_APPEND|O_CREAT, DEF_MODE);
    dup2(fd1,0);
    close(fd1);
    dup2(fd2,1);
    close(fd2);
    while((n=rio_readn(STDIN_FILENO,buf,MAXBUF))!= 0)
       rio_writen(STDOUT_FILENO,buf,n);
    exit(0);   
}

ssize_t rio_readn(int fd, void *usrbuf, size_t n)
{
    size_t nleft = n;
    ssize_t nread;
    char *bufp = usrbuf;

    while (nleft > 0) {
        if ((nread = read(fd, bufp, nleft)) < 0) {
            if (errno == EINTR)    /* Interrupted by sig handler return */
                nread = 0;        /* and call read() again */
            else
                return -1;       /* errno set by read() */
        }
        else if (nread == 0)
            break;               /* EOF */
        nleft -= nread;
        bufp += nread;
    }
    return (n - nleft);         /* Return >= 0 */
}

ssize_t rio_writen(int fd, void *usrbuf, size_t n)
{

  size_t nleft = n;
  ssize_t nwritten;  
  char *bufp = usrbuf;
  while (nleft > 0){
    if ((nwritten = write(fd, bufp, nleft)) <= 0){
      if (errno == EINTR)  /* Interrupted by sig handler return */
        nwritten = 0;      /* and call write() again */
      else
        return  -1;        /* errno set by write() */
    }
    nleft -= nwritten;
    bufp += nwritten;
  }
  return n;
}
相关推荐
社交怪人4 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
卢锡荣5 小时前
单芯通吃,盲插标杆 —— 乐得瑞 LDR6020,Type‑C 全场景互联 “智慧芯”
c语言·开发语言·计算机外设
不仙5205 小时前
VMware Workstation 26.0.0 在 Ubuntu 24.04 (内核 6.17.0) 上的安装与内核模块编译问题
linux·ubuntu·elasticsearch
AI科技星6 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
AI视觉网奇6 小时前
linux 检索库 判断库是否支持
java·linux·服务器
dapeng-大鹏6 小时前
KVM+LVM 零停机在线扩容 Ubuntu 根分区:从磁盘添加到逻辑卷扩展完整
linux·运维·ubuntu·磁盘空间扩展
kkeeper~6 小时前
0基础C语言积跬步之字符函数与字符串函数(上)
c语言·开发语言
闫记康6 小时前
Linux学习day5
linux·chrome·学习
TechPioneer_lp6 小时前
30 岁硕士 Linux C 开发背景,未来想去澳洲就业,研究方向该选 AI、SDN 漏洞还是 Linux 内核?
linux·人工智能·职业规划·澳洲求职
東隅已逝,桑榆非晚7 小时前
字符函数和字符串函数
c语言·笔记