在 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 现在引用这样一个打开的文件,而您错误地尝试写入它。像这样使用文件描述符是一个严重的错误。
下面是我写的代码
#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 现在引用这样一个打开的文件,而您错误地尝试写入它。像这样使用文件描述符是一个严重的错误。