unix阅读&写功能

时间:2012-07-29 07:40:22

标签: c unix kr-c

/*
Low Level I/O - Read and Write
Chapter 8 - The C Programming Language - K&R
Header file in the original code is "syscalls.h"
Also BUFSIZ is supposed to be defined in the same header file   
*/

#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>

#define BUFSIZ 1

int main()  /* copy input to output */
{
    char buf[BUFSIZ];
    int n;

    while ((n = read(0, buf, BUFSIZ)) > 0)
        write(1, buf, n);

    return 0;
}

当我输入“∂ΣΣ®†¥¥¥˚πΔ~~∫∫√çtu886661~EOF”作为输入时,将复制相同的内容。 如何同时存储这么多非ASCII字符?

BUFSIZ是要传输的字节数。 如果对于任何值,BUFSIZ如何限制字节传输,任何东西都可以从输入复制到输出?

char buf [BUFSIZ]如何存储非ASCII字符?

3 个答案:

答案 0 :(得分:4)

你读到小块直到EOF:

while ((n = read(0, buf, BUFSIZ)) > 0)

这就是原因。从字面上看,逐字节,复制输入到输出。如何将它转换回unicode,是控制台的问题,而不是你的问题。我猜,它不会输出任何东西,直到它可以将数据识别为符号。

答案 1 :(得分:0)

由于您在循环中调用read直到遇到错误时达到“文件结尾”,因此在每次调用read之后,您将在buf中获得正好1个字符。之后,通过写入系统调用打印该字符。保证读取系统调用的读取次数不会超过最后一个参数中指定的值。例如,如果您传递10,在您的情况下,将继续读取并尝试将读取的数据复制到数组范围之外。

至于你喂的字符 - 这些似乎是扩展的ASCII字符(代码128-255),所以这里没问题。

答案 2 :(得分:0)

当你从标准输入调用read时,你正在读取管道,绑定到终端或另一个程序。当然,在编写器(终端或其他程序)和程序之间有一个缓冲区。当此缓冲区是下溢读取器(您的程序)在读取时阻塞。当缓冲区溢出时写入阻塞写入器(终端等)。

反之亦然,当你写入标准输出时,你写入管道,绑定到终端或另一个程序。

因此,如果您的程序是由终端从shell运行的,那么您的程序输入和输出将绑定到(伪)终端。 (伪)终端是可以将用户按键转换为字符并将一些编码字符串(ISO8859-1,UTF-8等)转换为屏幕上的符号的程序。

  1. 在按EOL的EOF之前,字符存储在终端程序中。这是终端的规范模式。按下输入后,字节将写入绑定到程序的管道。
  2. BUFSIZ是您尝试从每次操作的输入读取的字节数。 n返回值是操作完成时实际读取的字节数。因此,BUFSIZ是程序可以从管道中读取的最大字节数。
  3. char [BUFSIZ]是字节数组(不是某些字符集的字符),因此它可以处理任何值(包括不可打印甚至为零)。