在 write(fd,...?

Is any operation needed prior to write(fd,...?

下面是我写的代码

#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;
}

compiled/linked,并执行

$ ./io
$ ./io 3> io_3.txt

第一行没有输出。第二行给了我包含 Testing 的文件 io_3.txt。 这都是预期的行为(我猜)。

即使在我的测试中它产生了预期的输出, 我不确定,为了避免潜在的问题、未定义的行为等,我是否应该在第一个 write 之前做任何事情,比如检查 fd=3 是否正在使用(在这种情况下,如何。 .. this可能适用),如果它适当打开等

出于同样的原因,我不确定是否应该在最后一个 write 之后执行某些操作。

也许我的做法是"non-risky",唯一潜在的问题是什么都没写,我可以通过检查nbytes的值来检测...我不知道。

欢迎任何澄清。

如果你写这样的程序,在没有 fd 3 open 的情况下执行它是一个用法错误。通常只有 0(stdin)、1(stdout)和 2(stderr)才能在没有自己打开的情况下按 number 使用的文件描述符。如果程序需要将额外的预打开文件描述符作为输入,标准的习惯用法是在命令行或环境变量上传递 fd 编号,而不是对它们进行硬编码。例如:

int main(int argc, char **argv) {
    if (argc<2 || !isdigit(argv[1][0])) return 1;
    int fd = strtol(argv[1], 0, 0);
    char c[100] = "Testing\n";
    ssize_t nbytes = write(fd, (void *) c, strlen(c));
    return 0;
}

实际上,如果 fd 3 未打开,像您这样的简单程序可能是安全的,写入失败。但是一旦你做了任何可能打开文件描述符的事情(可能在实现内部,比如 syslog 或 date/time 函数打开时区数据或消息翻译目录等),它可能会发生fd 3 现在引用这样一个打开的文件,而您错误地尝试写入它。像这样使用文件描述符是一个严重的错误。