【发布时间】:2020-09-04 18:34:53
【问题描述】:
我在下面写了代码
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main() {
int fd = 3;
char c[100] = "Testing\n";
ssize_t nbytes = write(fd, (void *) c, strlen(c));
return 0;
}
编译/链接,并执行
$ ./io
$ ./io 3> io_3.txt
第一行没有输出。第二行给了我文件io_3.txt,其中包含Testing。
这都是预期的行为(我猜)。
即使在我的测试中它产生了预期的输出,
我不确定,为了避免潜在的问题、未定义的行为等,我是否应该在第一个 write 之前做任何事情,比如检查 fd=3 是否正在使用(在这种情况下,如何... @987654321 @ 可能适用),如果它是适当开放的,等等。
出于同样的原因,我不确定是否应该在最后一个 write 之后执行一些操作。
也许我这样做的方式是“无风险”,唯一的潜在问题是没有写入任何内容,我可以通过检查 nbytes 的值来检测...我不知道。
欢迎任何澄清。
【问题讨论】:
-
您必须传递一个打开的文件描述符。所以通常你会使用
open或socket,或任何其他有效的文件描述符。在这种情况下,您依赖于您的 shell 解释器在执行程序之前为您做一些魔术。那不是便携式的。 -
没有 UB。带有未打开文件描述符参数的系统调用返回
EBADF。检查错误(负返回值和 errno)会发现。 -
将 fd 3 重定向到一个文件是可以的。但是如果 fd 没有打开写,errno 设置为EBADF
-
@PSkocik - 对!即使文本实际写入重定向目标,nbytes 设置为 -1,errno 设置为 EBADF。
标签: c file-descriptor write