"就算我输入“asdf”,read(0, buf, 1) 读到 buf 里后,调用 write(1, buf, 1) 却输出了 “asdf” 而不是我 ...
#include <unistd.h>
#define BUFFER_SIZE 1
int main() {
ssize_t read(int fd, void *buffer, size_t count);
void *buf;
while (read(0, buf, 1) != 'Q')
write(1, buf, 1);
return 0;
}
就。。。写得很糙,这里我 BUFFER_SIZE 设成 1 了,还是能读很多,刚才以为是需要对齐到 4 或 8字节的原因,但我试了下,输入“asdfa;lkasjdfasj;gkdasf"也能返回 阳间祝福 发表于 2022-8-14 12:03
就。。。写得很糙,这里我 BUFFER_SIZE 设成 1 了,还是能读很多,刚才以为是需要对齐到 4 或 8字节 ...
这个程序不就是输入什么输出什么吗?
一直while循环读取字符,不是 'Q' 就把这个字符输出
阳间祝福 发表于 2022-8-14 12:03
就。。。写得很糙,这里我 BUFFER_SIZE 设成 1 了,还是能读很多,刚才以为是需要对齐到 4 或 8字节 ...
还有,你的buf多少个字节了?
$ cat main.c
#include <stdio.h>
#include <unistd.h>
#define BUFFER_SIZE 1
int main() {
//ssize_t read(int fd, void *buffer, size_t count);
void *buf;
printf("%lu\n", sizeof(buf));
/*
while (read(0, buf, 1) != 'Q')
write(1, buf, 1);
*/
return 0;
}
$ gcc-debug -o main main.c
$ ./main
8
$ 阳间祝福 发表于 2022-8-14 12:03
就。。。写得很糙,这里我 BUFFER_SIZE 设成 1 了,还是能读很多,刚才以为是需要对齐到 4 或 8字节 ...
等一下,read函数的返回值是什么?
读取到的这1个字符?
那如果是这样呢?
read(0, buf, 2)
返回读取到的两个字符?
你把read函数的返回值和 'Q' 比较是什么意思?
人造人 发表于 2022-8-14 12:13
等一下,read函数的返回值是什么?
读取到的这1个字符?
那如果是这样呢?
emm当时想错了,read 返回的是 读的个数,不应该这么写,这里我只是想实现:不按回车就能读进去然后输出来,现在看是需要操作一下 ICANON ,而不是简单地 read 设只读 1 个字符 人造人 发表于 2022-8-14 12:10
还有,你的buf多少个字节了?
这里第 10 行 打印的是 buf 指针的大小吧?
我刚才试了一下,输入很长的串也可以,是不是因为它不检查越界什么的?
cat read_one.c
#include <unistd.h>
#include <stdio.h>
int main() {
ssize_t read(int fd, void *buffer, size_t count);
char buf;
printf("size: %d\n", sizeof(buf));
while (read(0, &buf, 1) != 0)
write(1, &buf, 1);
return 0;
}
size: 3
as;dlfkj;slakdjf;lksaj;lkjd;lkwejodijaskc;
as;dlfkj;slakdjf;lksaj;lkjd;lkwejodijaskc;
as;dlkfj;lkjg;sldkjg;lksdfvmkldsmvldskf;glkjsd;lkfjg;kerstj;lewrkj
as;dlkfj;lkjg;sldkjg;lksdfvmkldsmvldskf;glkjsd;lkfjg;kerstj;lewrkj
^C 阳间祝福 发表于 2022-8-14 12:27
这里第 10 行 打印的是 buf 指针的大小吧?
我刚才试了一下,输入很长的串也可以,是不是因为它不检查 ...
void *buf;
buf是什么?
buf是一个数组,数组里面有一个元素,元素的类型是 void *
1 * sizeof(void *)
1 * 8 = 8
你这个程序在做什么?
这个程序不就是输入什么输出什么吗?
输入一个字符,输出一个字符,一直循环
输入一个字符,输出一个字符,一直循环
你的buf有3个字节的空间,怎么会溢出呢?
人造人 发表于 2022-8-14 12:40
buf是什么?
buf是一个数组,数组里面有一个元素,元素的类型是 void *
1 * sizeof(void *)
是的,这个程序就是输入什么输出什么,只不过我在输入之后得按回车才会输出,所以我就好奇能不能不按回车就输出 阳间祝福 发表于 2022-8-14 12:43
是的,这个程序就是输入什么输出什么,只不过我在输入之后得按回车才会输出,所以我就好奇能不能不按回车 ...
"是不是因为它不检查越界什么的?"
什么?
人造人 发表于 2022-8-14 12:42
输入一个字符,输出一个字符,一直循环
你的buf有3个字节的空间,怎么会溢出呢?
哦哦这是不是说,我在控制台输入”asdfasdf" 并按下回车的时候,发生的是这样的事情:while 循环 8(还是 9)次,第一次读 'a', 存到 buf 处,然后紧接着调 write,把 'a' 写出来,然后再读 'b' , 存到 buf(还是 buf?) ,再调 write 写出来,以此类推?是这样理解的吗? 把 'a' 写出来,然后再读 'b' , 存到 buf(还是 buf?)
是存到 buf
人造人 发表于 2022-8-14 13:00
把 'a' 写出来,然后再读 'b' , 存到 buf(还是 buf?)
是存到 buf
啊啊,原来如此,这么一看 我刚才什么越界什么的发言是什么迷惑发言。。
谢谢!我有点明白了
页:
1
[2]