zoukankan      html  css  js  c++  java
  • 《UNIX环境高级编程》学习心得 三

    输入和输出

    1、文件描述符

    文件描述符(file descriptor)可以理解为内核在某个进程中访问一个文件时,内核向进程返回的一个非负整数。在内核使用open或creat打开一个现有文件或者创建一个新文件时,它都会返回一个文件描述符,并将其作为参数给read或者write用。

    2、标准输入、标准输出和标准错误

    按惯例,每当运行一个新程序时,所有的shell都为其打开三个文件描述符(0、1、2),即标准输入(standard input)、标准输出(standard output)以及标准错误(standard error)。

    我的理解:
    标准输入就是从终端(Terminal)对应的键盘中输入,标准输出应该就是直接在终端的屏幕上输出,标准错误也是直接显示在终端屏幕上的。

    3、不带缓冲的I/O
    函数 open、read、write、lseek和close提供了不带缓冲的I/O。这些函数都使用文件描述符。

    不带缓冲的I/O指的应该是这些函数是直接进行系统调用,就是用户使用的时候需要自己建立一个缓冲区,然后自己对这个缓冲区进行管理。而标准I/O呢,应该就是系统自己在用户层上建立了一个缓冲区,不需要用户创建,而且这个缓冲区的管理算法是大牛们写好的,非常高效,应该是比一般用户手撕缓冲区高效的多。

    有网友总结的数据流向路径是这样的:

    无缓存IO操作数据流向路径:数据——内核缓存区——磁盘

    标准IO操作数据流向路径:数据——流缓存区——内核缓存区——磁盘

    书中有这样的实例

    #include "apue.h"
    
    #define	BUFFSIZE	4096          //缓冲区的长度
    
    int
    main(void)
    {
    	int		n;
    	char	buf[BUFFSIZE];         //用户自己弄的缓冲区
    
    	while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)        // STDIN_FILENO 就是标准输入的文件描述符 值为0 //这条语句就是从标准输入里读
    		if (write(STDOUT_FILENO, buf, n) != n)             // STDOUT_FILENO 就是标准输出的文件描述符 值为1//这条语句就是写入标准输出
    			err_sys("write error");                    //err_sys 是大师自己写的一个出错处理
    
    	if (n < 0)
    		err_sys("read error");
    
    	exit(0);
    }
    

     这个例子呢就是使用不带缓冲的I/O从标准输入读,并向标准输出写。

    #include "apue.h"
    
    int
    main(void)
    {
    	int		c;
    
    	while ((c = getc(stdin)) != EOF)          // stdin表示标准输入   
    		if (putc(c, stdout) == EOF)        //stdout表示标准输出  与stdin一同在头文件<stdio.h>中定义的
    			err_sys("output error");
    
    	if (ferror(stdin))
    		err_sys("input error");
    
    	exit(0);
    }
    

     这个例子呢就是使用标准I/O从标准输入读入数据并写到标准输出中去。这里面有个EOF,EOF呢在<stdio.h>头文件里定义,值为-1。getc就是标准I/O函数,函数getc()用于从流中取字符,其原型是 int getc(FILE *stream); 参数*steam为要从中读取字符的文件流。它返回的是所读取的字符。当它读到文件尾而无数据时便返回-1(EOF)。

    由于EOF的值为-1,所以也有如下写法:

    while(~getc()){
             
    }
    

    -1的的反码为0,所以该函数在读到文件结束会停止该循环。

  • 相关阅读:
    构造方法
    $this
    public/private/protected三种访问控制符的区别
    vsftpd的虚拟主机配置,错误记录
    高斯模糊css
    css绘制三角形
    禁止缩放的一行代码
    自适应的Javascript代码resize.js
    判断是pc端还是手机端js
    倒计时
  • 原文地址:https://www.cnblogs.com/night163/p/4980610.html
Copyright © 2011-2022 走看看