0

このコードには 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;
}

これは何も印刷しません。なぜですか?

4

2 に答える 2

4

標準エラーは、エラーメッセージが出力されるはずの場所です。そのperror()ため、エラーメッセージを標準エラーに出力します。標準エラーを閉じると、メッセージを出力できません。

「main: Success」と表示されるのはなぜですか? すべてのディレクトリに「。」があるべきではありません。開くことができるディレクトリ?

はい、そうです。を呼び出したときにエラーが発生しなかったfopen()のでerrno == 0、このメッセージは ですSuccess

失敗したときにエラーメッセージを出力したい場合は、以下fopen()をテストする必要がありますNULL:

if (fopen(".") == NULL) {
    printf("main: %s \n", strerror(errno));
}

ファイルを開くとき、使用される FD は利用可能な最小の FD であることに注意してください。FD 2 を閉じたので、開くときに使用される可能性が最も高い.です。.そのため、標準エラーは、書き込めないディレクトリを指すようになりperror()、そこに書き込もうとするとエラーが発生します。しかし、このエラーを報告することはできません (どこに報告するのでしょうか?)。

于 2020-05-27T17:59:54.767 に答える