- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在学习测试中使用 read(2) 时遇到一些问题。
代码如下:
#include <stdio.h>
int main() {
size_t length;
read(0, &length, sizeof(length));
printf("input = %u\n", length);
return 0;
}
我想这段代码将从 stdio 读取 8 个字节(即 ascii 字符),并将它们存储在长度变量中。然后它会把这8个字节对应的unsigned int值打印到stdout。
所以,让我的测试如下:从 linux 终端运行这个程序,然后点击“enter”。我希望 length 的值仅为 10(换行字符的 ascii 值)。
但是运行这个测试(也是很多次):
$ ./test
len = 4195338
但是这个版本的代码像我期望的那样工作:
#include <stdio.h>
int main() {
int a = 10;
size_t length;
int b = 123;
ssize_t n = read(0, &length, sizeof(length));
printf("input = %u\n", length);
return 0;
}
$ ./test
input = 10
那么,有什么意义呢?为什么如果我添加一些随机的和未使用的变量,并且如果我存储 read() 的返回值,相同输入的输出会不同?
注意我知道 read(2) 是一个原始系统调用,不应该从终端读取输入,这只是一个学习问题。
最佳答案
如果 sizeof(size_t) == 8
,代码将读取 8 个字节 — true。
一般来说,这些字节不会全部是 ASCII(这意味着有些字节将设置第 8 位并且值在 0x80..0xFF 范围内,这不是 ASCII 的一部分)。
但是,没有字符的转换。如果您的文件包含 12345678
,则该值将为 0x3132333435363738(或者可能为 0x3837363534333231)。如果需要转换,则不要使用 read(2)
。
printf()
格式应该是 %zu
(C99) 或 %lu
(C89 with size_t
相当于64位unsigned long
;当然不能是unsigned long long
和C89)。
请注意,您的示例输出并非来自您的示例代码。示例输出显示 len = ...
但代码会生成 input = ...
。因此,您的问题之一可能是您没有测试您认为正在测试的内容。
你的评论:
I know that read(2) is a raw system call and is not supposed to read input from terminal.
read(2)
系统调用(可能)被 getchar()
等函数用来从终端读取数据。用它从终端读取并没有错。从终端读取到字符数组以外的内容可能是不正确的。
I simply run the program from terminal, and then hit enter from keyboard.
哦。打扰。我从没想过你会那样做。
好吧,你将一个字节的数据读入一个需要 8 个字节的变量中,你会得到垃圾。您的变量未可靠初始化。
这是一个带有示例输出的 SSCCE ( Short, Self-Contained, Correct Example ):
#include <stdio.h>
#include <unistd.h>
int main(void)
{
size_t length = 0xFFFFFFFFFFFFFFFF;
int nbytes = read(0, &length, sizeof(length));
printf("nbytes = %d: input = %zu (0x%zX)\n", nbytes, length, length);
return 0;
}
两个样本运行:
$ ./test
nbytes = 1: input = 18446744073709551370 (0xFFFFFFFFFFFFFF0A)
$ ./test
12345678
nbytes = 8: input = 4050765991979987505 (0x3837363534333231)
$ ./test < /dev/null
nbytes = 0: input = 18446744073709551615 (0xFFFFFFFFFFFFFFFF)
$
你看到那里发生了什么吗?请注意,SSCCE 代码关注并报告读取的字节数。始终检查类似读取操作的返回值很重要(这里,这具体意味着 read()
);如果您没有获得预期的那么多数据,那么您的结果也可能不是您预期的那样。在“命中换行符”的情况下使用值可能是“未定义的行为”,尽管显示的行为是您通常会得到的。
(在 Mac OS X 10.8.3 上使用 GCC 4.7.1 进行测试 — Intel 芯片,little-endian。)
关于c - POSIX 读取 (2),意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16622565/
是否有详细说明从一个 POSIX 版本更改为另一个版本的文档?我正在寻找一些东西,在表格 View 中,详细说明从 2004 年到 2008 年的变化 最佳答案 有点。这是Rationale ,每卷一
根据POSIX FAQ ,该标准已于 2013 年由 IEEE 修订和批准。 与 2008 年的先前标准相比有何变化? 最佳答案 根据 online edition 中的摘要, POSIX.1-2
我正在开发一个简单的并行应用程序,我想在其中使用单个进程来维护有关一系列工作进程的状态信息。设置一个 POSIX 消息队列似乎相对容易,其中所有工蜂都可以向状态维护者发送定期更新。我的问题? POSI
计划使用 posix 信号量来同步 2 个进程。不太确定使用哪个 - 命名或未命名。 各自的优缺点是什么?我如何决定使用哪个?在哪些情况下,一种优于另一种? 谢谢。 最佳答案 如果这两个进程不相关,则
嵌套参数替换在 Zsh 中有效: $ param=abc # nested remove prefix ${...#a} and remove suffix ${...%c} => $ printf
更新:整个问题出在一条错误线上,这是我的 C++ 代码中的语法错误。 在 Linux 上我发现 #define _NSIG 64 在 asm-generic/signal.h ,
我在网上遇到了两个 POSIX 文档。 http://pubs.opengroup.org/onlinepubs/009695399/ (IEEE 标准 1003.1,2004 年版) Abstrac
我正在开发一个简单的软件来检查我是否能够使用我研究过的 POSIX 定时器和信号进行编程。 我正在尝试做一个简单的程序来启动计时器并在一定的纳秒内发出信号 下面的程序运行得不好,所以我写了一些关于我的
如果我有一个通过 shell 运行的应用程序,是否有 POSIX 文档说 --help需要支持吗?我会这么认为,因为这似乎是最流行的终端应用程序(GNU 工具等)中的标准做法。 我很好奇我是否可以使用
自适应 AUTOSAR 基于什么 POSIX PSE51? 在学习自适应 AUTOSAR 时,我发现“自适应 AUTOSAR 基于 POSIX PSE51”。 但是,我不明白什么是 POSIX PSE
GNU bash manual说到shell参数有以下一段话: The command builtin does not prevent builtins that take assignment s
我应该在我的嵌入式 Linux 环境中使用 System V 消息队列还是 Posix 消息队列?项目中常用什么? 最佳答案 两者都有相同的基本工具——信号量、共享内存和消息队列。它们为这些工具提供了
用 tsearch 填充了 POSIX 二叉树后,如何清理整棵树? GCC 提供了 tdestroy 作为扩展,但是如果你想使用 POSIX-only 函数,你该怎么做呢? 我当前的实现使用 twal
来自 C++ 应用程序。为 AIX、HP-UX、Linux、OSX 和 Solaris 编译是否有一种简单的方法来确定应用程序是否可用。在系统启动后 5 分钟内运行? 在 Windows 上我可以这样
System V IPC 和 POSIX IPC 之间有什么区别? 为什么我们有两个标准? 如何决定使用哪些 IPC 函数? 最佳答案 两者都有相同的基本工具——信号量、共享内存和消息队列。它们提供的
根据this ,POSIX 库不包含 getopt.h。但是,我在 unistd.h 中找到了这个: #ifdef __USE_POSIX2 /* Get definitions and proto
我正在尝试使用 POSIX 共享内存和 POSIX 信号量构建客户端服务器应用程序。我是否必须将信号量放在共享内存段内,或者信号量是否可以只是全局变量?我希望遵守 POSIX 约定。 最佳答案 不,信
尝试读取 Rust fn 中任意用户的主目录,并使用 posix::pwd crate。 不幸的是,我找不到任何使用 FFI 的好例子,并且一直在处理关于指针和类型可变性的各种类型错误。 我的(非编译
我阅读了一个信号的手册页使用 man 7 signal我看到两种类型的信号。所以,我有一个问题, Linux 中的POSIX 可靠信号 和POSIX 实时信号 有什么区别? 最佳答案 如今,将这些表述
据我所知,ucontext 提供了比 setjmp 更好的东西。但它已被弃用,现在已从 POSIX 规范中删除。那么它为什么会出现,又为什么会被移除? 最佳答案 makecontext的签名来自 uc
我是一名优秀的程序员,十分优秀!