在Unix中使用read()
系统调用读取用户输入的可能方法有哪些。我们如何使用read()
?
答案 0 :(得分:28)
您可以执行以下操作来读取10个字节:
char buffer[10];
read(STDIN_FILENO, buffer, 10);
记住read()不会添加'\0'
来终止以使其成为字符串(只是给出原始缓冲区)。
一次读取1个字节:
char ch;
while(read(STDIN_FILENO, &ch, 1) > 0)
{
//do stuff
}
并且不要忘记在此文件中将#include <unistd.h>
,STDIN_FILENO
定义为宏。
有三个标准POSIX文件描述符,对应于三个标准流,可能每个进程都应该具有这些描述符:
Integer value Name
0 Standard input (stdin)
1 Standard output (stdout)
2 Standard error (stderr)
因此,STDIN_FILENO
可以使用0。
修改强>
在Linux系统中,您可以使用以下命令找到它:
$ sudo grep 'STDIN_FILENO' /usr/include/* -R | grep 'define'
/usr/include/unistd.h:#define STDIN_FILENO 0 /* Standard input. */
注意评论/* Standard input. */
答案 1 :(得分:7)
来自man read:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
输入参数:
int fd
文件描述符是一个整数而不是文件指针。 stdin
的文件描述符为0
void *buf
指向缓冲区的指针,用于存储read
函数读取的字符
size_t count
要阅读的最大字符数
因此,您可以使用以下代码逐个字符地阅读:
char buf[1];
while(read(0, buf, sizeof(buf))>0) {
// read() here read from stdin charachter by character
// the buf[0] contains the character got by read()
....
}