• UC编程:输入输出重定向(系统调用)


    在Unix下,系统重定向是使用dup和dup2函数完成的 在学习使用这两个函数之前,必须要搞懂一个概念就是文件描述符
    摘自:《文件描述符和文件指针的区别》 文件描述符就是open文件时产生的一个整数,直到一个索引作用,它用于UNIX系统中,用于标识文件。 文件指针是指向一个FILE的结构体,这个结构体里有一个元素就是文件描述符。它用于ANSI C标准的IO库调用中,用于标识文件。 既然FILE中包含文件描述符元素,可以用fopen()直接获取指针fp,然后使用fp获得fp中所包含文件描述符fd的信息。 文件描述符应该是唯一的,但文件指针(值)却不是唯一的,但指向的对象却应该是唯一的。 FILE *中除了包含了fd信息,还包含了IO缓冲,所以可以理解为FILE是对fd的墙头,是C标准形式,所以FILE *比fd更适合跨平台,应该多用fopen在,少用open。 C语言文件指针与文件描述符之间可以相互转换: int fileno(FILE *stream); FILE *fdopen(int fd, const char *mode);
    来看一下下图的实现过程 090807135044 简单明了,不解释过多。再来看一下程序: 结合上图理解一下过程。 [c] #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { int fd, save_fd; char msg[] = "This is a test "; fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); if(fd<0) { perror("open"); exit(1); } save_fd = dup(STDOUT_FILENO); dup2(fd, STDOUT_FILENO); close(fd); write(STDOUT_FILENO, msg, strlen(msg)); dup2(save_fd, STDOUT_FILENO); write(STDOUT_FILENO, msg, strlen(msg)); close(save_fd); return 0; } [/c] 上面的程序按照流程图就很容易理解了,再多说两句就是STDOUT_FILENO也就是“1”的文件描述符 再有就是当改变输出方向后,不仅仅write函数,使用printf函数结果也都是一样的......haha
  • 相关阅读:
    ARM Linux 3.x的设备树(Device Tree)
    ubuntu 14.04 编译内核出现unable to locate package ncurses-devel 问题的解决
    Device Tree Usage( DTS文件语法)
    Ubuntu 14.04中gedit打开文件出现中文乱码问题
    Jenkins中集成jmeter-maven插件
    Linux(centos6.5)下安装jenkins
    IM系统架构设计之浅见
    一些常用软件的网络端口协议分类介绍
    Jenkins执行批处理文件失败
    八大持续集成工具
  • 原文地址:https://www.cnblogs.com/ishell/p/4240145.html
Copyright © 2020-2023  润新知