news 2026/4/15 9:11:55

I/O重定向程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
I/O重定向程序

从标准输入拷贝文件或从指定磁盘文件拷贝到标准输出。

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #define DEF_MODE S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH #define DEF_UMASK S_IWGRP|S_IWOTH #define RIO_BUFSIZE 8192 #define MAXLINE 10 typedef struct { int rio_fd; /* Descriptor for this internal buf */ int rio_cnt; /* unread bytes in internal buf */ char *rio_bufptr; /* Next unread bytes in internal buf */ char rio_buf[RIO_BUFSIZE]; /* Internal buffer */ } rio_t; void rio_readinitb(rio_t *rp, int fd); ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen); static ssize_t rio_read(rio_t *rp, char *usrbuf, size_t n); ssize_t rio_writen(int fd, void *usrbuf, size_t n); int main(int argc, char **argv) { int n,fd1; rio_t rio; char buf[MAXLINE]; if((argc!=1) && (argc!=2)) { fprintf(stderr,"usage : %s <infile>\n",argv[0]); exit(1); } if(argc==2){ int fd; if((fd=open(argv[1], O_RDONLY,0))<0) { fprintf(stderr,"Couldn'tread%s\n",argv[1]); exit(1); } dup2(fd, STDIN_FILENO); close(fd); } rio_readinitb(&rio, STDIN_FILENO); while((n = rio_readlineb(&rio, buf, MAXLINE)) != 0) rio_writen(STDOUT_FILENO, buf, n); 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; } void rio_readinitb(rio_t *rp, int fd) { rp->rio_fd = fd; rp->rio_cnt = 0; rp->rio_bufptr = rp->rio_buf; } ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen) { int n, rc; char c, *bufp = usrbuf; for (n = 1; n < maxlen; n++) { if ((rc = rio_read(rp, &c, 1)) == 1) { *bufp++ = c; if (c == '\n') break; } else if (rc == 0) { if (n == 1) return 0; /* EOF, no data read */ else break; /* EOF, some data was read */ } else return -1; /* Error */ } *bufp = 0; return n; } static ssize_t rio_read(rio_t *rp, char *usrbuf, size_t n) { int cnt; while (rp->rio_cnt <= 0) { /* Refill if buf is empty */ rp->rio_cnt = read(rp->rio_fd, rp->rio_buf, sizeof(rp->rio_buf)); if (rp->rio_cnt < 0) { if (errno != EINTR) /* Interrupted by sig handler return */ return -1; } else if (rp->rio_cnt == 0) /* EOF */ return 0; else rp->rio_bufptr = rp->rio_buf; /* Reset buffer ptr */ } /* Copy min(n, rp->rio_cnt) bytes from internal buf to user buf */ cnt = n; if (rp->rio_cnt < n) cnt = rp->rio_cnt; memcpy(usrbuf, rp->rio_bufptr, cnt); rp->rio_bufptr += cnt; rp->rio_cnt -= cnt; return cnt; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 11:41:26

Canoga Perkins将突破型专用5G技术引入墨西哥克雷塔罗BLOQUE创新中心

作为全球领先的专用5G网络连接解决方案提供商&#xff0c;Canoga Perkins宣布在墨西哥克雷塔罗BLOQUE创新中心正式设立其首个海外专用5G客户体验中心。2026年1月16日&#xff0c;公司在“Experiencing SyncMetra”活动期间&#xff0c;现场演示了SyncMetra 100产品以及完整的端…

作者头像 李华
网站建设 2026/4/13 8:38:55

超声波深度测量仪设计与实现

超声波深度测量仪设计与实现 一、设计背景与意义 超声波深度测量在水文监测、工业液位控制、水产养殖、污水处理等领域具有不可替代的作用。传统深度测量方法&#xff08;如浮标法、机械探测法&#xff09;存在操作复杂、测量滞后、易受环境干扰等问题&#xff0c;现有超声波…

作者头像 李华
网站建设 2026/4/9 8:57:36

【Redis持久化核心】AOF/RDB通俗详解+多场景对比

在讲核心内容前&#xff0c;先定一个前提&#xff1a;Redis是纯内存数据库&#xff0c;数据都存在内存里&#xff0c;一旦Redis重启/服务器断电&#xff0c;内存数据会直接消失。持久化就是Redis把内存数据“存到硬盘文件里”的操作&#xff0c;目的是重启后能恢复数据&#xf…

作者头像 李华
网站建设 2026/4/13 13:02:45

贡嘎山下的蓝色冰川,藏着海螺沟的旷世温柔

海螺沟位于四川省甘孜藏族自治州&#xff0c;其核心特点是同一区域内冰川、原始森林、温泉与雪山的罕见共存&#xff0c;形成了强烈而独特的视觉与地理反差。景区发源于贡嘎雪山东坡&#xff0c;主沟纵深超过30公里。现代海洋性冰川是这里的首要地质特征&#xff0c;巨大的冰舌…

作者头像 李华
网站建设 2026/4/8 1:50:30

django+Pythonuniapp的心理咨询信息系统APP小程序

文章目录技术栈与架构设计核心功能模块数据安全与合规性能优化策略部署与扩展性典型代码片段&#xff08;Django示例&#xff09;系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;技术栈与架构设计 …

作者头像 李华
网站建设 2026/4/8 8:06:00

每天一个Linux命令_tar

tar 是 Tape Archive&#xff08;磁带归档&#xff09;的缩写 tar用来压缩和解压文件。tar本身不具有压缩功能。他是调用压缩功能实现的 打包&#xff08;不压缩&#xff09;&#xff1a;tar -cf 归档名.tar 源文件/目录 tar -cf testdir.tar testdir 解压&#xff08;不压…

作者头像 李华