阳间祝福 发表于 2022-8-14 12:03:45

人造人 发表于 2022-8-14 07:19
"就算我输入“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:07:16

阳间祝福 发表于 2022-8-14 12:03
就。。。写得很糙,这里我 BUFFER_SIZE 设成 1 了,还是能读很多,刚才以为是需要对齐到 4 或 8字节 ...

这个程序不就是输入什么输出什么吗?
一直while循环读取字符,不是 'Q' 就把这个字符输出

人造人 发表于 2022-8-14 12:10:10

阳间祝福 发表于 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:13:24

阳间祝福 发表于 2022-8-14 12:03
就。。。写得很糙,这里我 BUFFER_SIZE 设成 1 了,还是能读很多,刚才以为是需要对齐到 4 或 8字节 ...

等一下,read函数的返回值是什么?
读取到的这1个字符?
那如果是这样呢?
read(0, buf, 2)
返回读取到的两个字符?
你把read函数的返回值和 'Q' 比较是什么意思?

阳间祝福 发表于 2022-8-14 12:19:03

人造人 发表于 2022-8-14 12:13
等一下,read函数的返回值是什么?
读取到的这1个字符?
那如果是这样呢?


emm当时想错了,read 返回的是 读的个数,不应该这么写,这里我只是想实现:不按回车就能读进去然后输出来,现在看是需要操作一下 ICANON ,而不是简单地 read 设只读 1 个字符

阳间祝福 发表于 2022-8-14 12:27:02

人造人 发表于 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:40:03

阳间祝福 发表于 2022-8-14 12:27
这里第 10 行 打印的是 buf 指针的大小吧?

我刚才试了一下,输入很长的串也可以,是不是因为它不检查 ...

void *buf;
buf是什么?
buf是一个数组,数组里面有一个元素,元素的类型是 void *
1 * sizeof(void *)
1 * 8 = 8


你这个程序在做什么?
这个程序不就是输入什么输出什么吗?
输入一个字符,输出一个字符,一直循环

人造人 发表于 2022-8-14 12:42:58

输入一个字符,输出一个字符,一直循环
你的buf有3个字节的空间,怎么会溢出呢?

阳间祝福 发表于 2022-8-14 12:43:55

人造人 发表于 2022-8-14 12:40
buf是什么?
buf是一个数组,数组里面有一个元素,元素的类型是 void *
1 * sizeof(void *)


是的,这个程序就是输入什么输出什么,只不过我在输入之后得按回车才会输出,所以我就好奇能不能不按回车就输出

人造人 发表于 2022-8-14 12:46:54

阳间祝福 发表于 2022-8-14 12:43
是的,这个程序就是输入什么输出什么,只不过我在输入之后得按回车才会输出,所以我就好奇能不能不按回车 ...

"是不是因为它不检查越界什么的?"
什么?

阳间祝福 发表于 2022-8-14 12:56:23

人造人 发表于 2022-8-14 12:42
输入一个字符,输出一个字符,一直循环
你的buf有3个字节的空间,怎么会溢出呢?

哦哦这是不是说,我在控制台输入”asdfasdf" 并按下回车的时候,发生的是这样的事情:while 循环 8(还是 9)次,第一次读 'a', 存到 buf 处,然后紧接着调 write,把 'a' 写出来,然后再读 'b' , 存到 buf(还是 buf?) ,再调 write 写出来,以此类推?是这样理解的吗?

人造人 发表于 2022-8-14 13:00:21

把 'a' 写出来,然后再读 'b' , 存到 buf(还是 buf?)
是存到 buf

阳间祝福 发表于 2022-8-14 13:03:49

人造人 发表于 2022-8-14 13:00
把 'a' 写出来,然后再读 'b' , 存到 buf(还是 buf?)
是存到 buf

啊啊,原来如此,这么一看 我刚才什么越界什么的发言是什么迷惑发言。。

谢谢!我有点明白了
页: 1 [2]
查看完整版本: 如何让程序一次读一个字符且不需要按下回车就能执行