news 2026/4/23 11:20:49

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/18 16:31:48

AI 办公提效的关键是什么?5 个可复用工作流(含 Prompt 模板)

随着人工智能相关工具越来越多&#xff0c;很多打工人心里其实都有一个差不多的感觉&#xff1a;AI 好像已经渗透进了各种办公场景&#xff0c;过去要求的职场技能开始加上了AI的标签&#xff0c;逐渐演变成为职场的 AI 技能。真正在办公中使用AI之后&#xff0c;你就会发现技能…

作者头像 李华
网站建设 2026/4/23 9:53:41

开发工具类——获取唯一标识号

问题&#xff1a;现在有一批货物需要编号0000-9999&#xff0c;使用普通随机可能会重复获取 解决方案&#xff1a;根据当年当天的时间为依据&#xff0c;一年内不会重复的4位数&#xff0c;利用年日时分秒的组合&#xff0c;通过哈希算法生成固定4位数字。 import java.time.L…

作者头像 李华
网站建设 2026/4/23 9:52:49

腾讯云渠道商:轻量服务器低成本托管小型网站的 5 个关键实践

一、引言 随着云计算普及&#xff0c;越来越多的用户选择腾讯云轻量应用服务器托管小型网站。但服务器运维直接影响网站稳定性和安全性。本文结合行业实践&#xff0c;总结低成本托管小型网站的 5 个关键实践&#xff0c;帮助您高效管理云服务器。 二、5 大关键运维实践&#…

作者头像 李华
网站建设 2026/4/23 11:19:11

页面加载性能手动检查指南

在软件测试领域&#xff0c;页面加载性能直接影响用户体验和业务转化率。作为测试从业者&#xff0c;手动检查能深入定位瓶颈&#xff0c;避免依赖自动化工具的局限性。本文系统介绍手动检查的核心方法、工具使用和优化策略&#xff0c;帮助测试人员高效评估Web应用性能。 一、…

作者头像 李华
网站建设 2026/4/23 9:54:20

车载智能洗手器设计与实现

车载智能洗手器设计与实现 一、设计背景与意义 车载场景中&#xff0c;驾乘人员在长途行驶、户外露营或接触污渍后&#xff0c;存在手部清洁需求&#xff0c;但传统车载清洁依赖瓶装水纸巾&#xff0c;存在浪费水资源、清洁不彻底、操作不便等问题。现有便携洗手器多为手动按压…

作者头像 李华
网站建设 2026/4/23 11:20:36

全国首家网络空间安全大学要来了,560分可以被录取吗?

收藏 | 网络安全人才缺口将达327万&#xff01;武汉网络空间安全学院报考全攻略&#xff0c;录取分数线预测 武汉网络空间安全学院是唯一以"网络空间安全"命名的独立高校&#xff0c;首批开设6个相关专业。网络安全行业前景广阔&#xff0c;到2027年人才缺口将达327…

作者头像 李华