思路很简单,从标准输入文件描述符读入数据,然后同时向标准输出和参数指定的文件写出数据;如果加了 -a 选项,则以追加的方式向文件写出数据。还没了解 getopt() 函数就没判断参数是否合法。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <errno.h> #ifndef BUF_SIZE
#define BUF_SIZE 1024
#endif int main(int argc, char const *argv[])
{
int outputFd;
/* 命令格式要求为 `tee [-a] file`,没有判断参数是否合法*/
if(argc == 3){ //加了 -a 选项,则以追加的方式写数据
outputFd = open(argv[2], O_WRONLY | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP); //rw-r-----
} else if (argc == 2){
outputFd = open(argv[1], O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP); //rw-r-----
} if(outputFd == -1){
perror(strerror(errno));
exit(EXIT_FAILURE);
} char buffer[BUF_SIZE];
int readNum; while((readNum = read(STDIN_FILENO, buffer, BUF_SIZE)) > 0){
ssize_t fileWrNum = write(outputFd, buffer, readNum); //向指定文件写出数据
ssize_t stdoutWrNum = write(STDOUT_FILENO, buffer, readNum); //向标准输出写入数据 if(fileWrNum != readNum || stdoutWrNum != readNum){ //判断是否写成功
perror("couldn't write the whole buffer\n");
exit(EXIT_FAILURE);
}
}
if(readNum == -1){ //判断是否读取成功
perror(strerror(errno));
exit(EXIT_FAILURE);
} if(close(outputFd) == -1){ //判断是否成功关闭
perror(strerror(errno));
exit(EXIT_FAILURE);
}
   exit(EXIT_SUCCESS);
}

  

Linux/UNIX编程:实现简单 tee 命令的更多相关文章

  1. Linux/UNIX编程:使用C语言实现简单的 ls 命令

    刚好把 Linux/UNIX 编程中的文件和IO部分学完了,就想编写个 ls 命令练习一下,本以为很简单,调用个 stat 就完事了,没想到前前后后弄了七八个小时,90%的时间都用在格式化(像 ls ...

  2. 学习linux/unix编程方法的建议(转)

    假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过 我想大概可以分为4个阶段,水平从低到高从安装使用=>linux常用命令=>linux ...

  3. 学习linux/unix编程方法的建议,学习Linux的四个步骤(转)

    解答:学习Linux的四个步骤假设你是计算机科班出身,计算机系的基本课程如数据结构.操作系统.体系结构.编译原理.计算机网络你全修过我想大概可以分为4个阶段,水平从低到高从安装使用=>linux ...

  4. Linux/UNIX编程如何保证文件落盘

    本文转载自Linux/UNIX编程如何保证文件落盘 导语 我们编写程序write数据到文件中时,其实数据不会立马写入磁盘,而是会经过层层缓存.每层缓存都有自己的刷新时机,每层缓存都刷新后才会写入磁盘. ...

  5. 在Linux/Unix系统下用iconv命令处理文本文件中文乱码问题

    iconv命令是运行于linux/unix平台的文件编码装换工具.当我们在linux/unix系统shell查看文本文件时,常常会发现文件的中文是乱码的,这是由于文本文件的编码与当前操作系统设置的编码 ...

  6. Linux History安全问题【保存记录防止删除】+完善Linux/UNIX审计 将每个shell命令记入日志

    2011-09-27 22:11:51|  分类: rhel5_033|举报|字号 订阅       Linux利用PROMPT_COMMAND实现审计功能 这个系统审计,记录什么用户,在什么时间,做 ...

  7. Linux rpc 编程最简单实例

    通过rpcgen的man手册看到此工具的作用是把RPC源程序编译成C语言源程序,从而轻松实现远程过程调用.1.下面的例子程序的作用是客户端程序(fedora Linux下)取中心服务器也是Linux上 ...

  8. Linux/Unix编程中的线程安全问题【转】

    转自:http://blog.csdn.net/zhengzhoudaxue2/article/details/6432984 在目前的计算机科学中,线程是操作系统调度的最小单元,进程是资源分配的最小 ...

  9. Linux/Unix下的任务管理器-top命令

    Windows下的任务管理器虽然不好用(个人更喜欢Process Explorer些),但也算方便,可以方便的查看进程,CPU,内存...也可以很容易的结束进程 没有图形化界面下的Linux,也有命令 ...

随机推荐

  1. CSS单行文字超出省略

    .ellipsis { white-space:nowrap overflow:hidden text-overflow:ellipsis }

  2. docker-tmpfs挂载

    使用tmpfs挂载 卷和绑定装置允许在主机和容器之间共享文件,以便即使在容器停止后也可以保留数据. 如果你在Linux上运行Docker,你有第三个选择:tmpfs mounts.使用tmpfs装载创 ...

  3. PHP 对接 饿了么开放平台 接单

    <?php # 一开始使用的是API方式对接,所以我这里是API的方式+SDK的结合 (除了获取token之外都是使用SDK方式,所以看到的朋友还是直接使用纯SDK方式对接最好),因为我这里使用 ...

  4. Spring-Boot使用嵌入式容器,那怎么配置自定义Filter呢

    Listener.Filter和Servlet是Java Web开发过程中常用的三个组件,其中Filter组件的使用频率最高,经常被用来做简单的权限处理.请求头过滤和防止XSS攻击等.如果我们使用的是 ...

  5. 基于 HTML5 + WebGL 的3D无人机 展示

    前言 近年来,无人机的发展越发迅速,既可民用于航拍,又可军用于侦察,涉及行业广泛,也被称为“会飞的照相机”.但作为军事使用,无人机的各项性能要求更加严格.重要.本系统则是通过 Hightopo 的   ...

  6. js的内存泄漏场景、监控以及分析

    内存泄漏 Q:什么是内存泄漏? 字面上的意思,申请的内存没有及时回收掉,被泄漏了 Q:为什么会发生内存泄漏? 虽然前端有垃圾回收机制,但当某块无用的内存,却无法被垃圾回收机制认为是垃圾时,也就发生内存 ...

  7. Epplus Excel 导入 MSSQL 数据库

    效果: 下载EXE     源码

  8. STM32F429的特点

    STM32F429 内核 Crotex M4 最高主频 180MHZ FPU 有 DSP指令集 有 最大SRAM 256K 备份域SRAM 有 最大FLASH 2MB GPIO最高翻转速度 90MHZ ...

  9. 权限认证基础:区分Authentication,Authorization以及Cookie、Session、Token

    1. 认证 (Authentication) 和授权 (Authorization)的区别是什么? 这是一个绝大多数人都会混淆的问题.首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我 ...

  10. macOS 10.11.* 安装scrapy

    1.安装brew,然后修改brew源为某高校 2.更新python brew install python 3.安装pip 4.安装scrapy,这里肯定会有一个坑,之前在网上看到10.11开启了什么 ...