【发布时间】:2020-09-14 21:14:57
【问题描述】:
我已经实现了这个带有 close(2) 的代码,你们中的许多人(包括我自己)都知道这会关闭标准错误,但是关闭它的主要影响是什么?
为什么要打印“main: Success”?不应该每个目录都有“。”可以打开的目录吗?
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
int main() {
close(2);
if (fopen(".","r"))
{
printf("main: %s \n", strerror(errno));
}
return 0;
}
另一方面
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int main() {
close(2);
if (fopen(".","r"))
{
perror("main");
}
return 0;
}
这不打印任何东西,有什么想法吗?
【问题讨论】:
-
我的猜测是对
fopen的两次调用都成功了,但是由于您已关闭stderr,因此您无法在第二个sn-p 中看到该消息(perror使用stderr) ,在第一个 sn-p 中尝试fprintf(stderr, "main: %s \n", strerror(errno));看看会发生什么。 -
@DavidRanieri 如果 stderr 已关闭,则无法打印到 stderr。
-
@Barmar 再也不奇怪了 :) 是的,这就是重点
标签: c system-calls errno unistd.h strerror