В каких случаях printf возвращает отрицательное значение? - PullRequest
0 голосов
/ 20 июня 2020

Я работал над своей версией printf в образовательных целях, и, читая руководство, я прочитал, что функция может возвращать отрицательное значение при обнаружении ошибки.

Сначала я думал, что она возвращает - 1 / отрицательное значение, когда в строке формата возникает ошибка, но это не так.

Я начал думать, что он возвращает -1, когда обнаруживает некоторую ошибку системного вызова и не может записать в файл дескриптор, затем я протестировал этот код, чтобы проверить эту идею:

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    errno = 0;
    int stdout2 = dup(STDOUT_FILENO);
    close(STDOUT_FILENO);
    int ret = printf("Hey", "Hello");
    fprintf(stderr, "%d\t%s\n", ret, strerror(errno));
}

Он вывел:

3       Bad file descriptor

Errno установлен, на самом деле есть ошибка (дескриптор файла близок), но отрицательные значения не выводятся.

Я использую Linux и использую glib c, но я также встречал этот случай в MacOS. Есть идеи?

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Итак, я прочитал все ваши комментарии, и, благодаря Питеру, я закрыл stdoud вот так

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    errno = 0;
    fclose(stdout);
    int ret = printf("Hey", "Hello");
    fprintf(stderr, "%d\t%s\n", ret, strerror(errno));
}

И, наконец, он возвращает -1. Но я удивлен, что printf не проверяет значения системных вызовов и не угрожает им как ошибкой, когда они есть (потому что, когда я закрываю файловый дескриптор напрямую, printf не работает и устанавливает errno на Bad File Descriptor, но возвращает номер символов, а не ошибка). Спасибо за все ваши ответы! И извините, если я оставил грязный код, который я тестировал в 4 утра, ха-ха.

0 голосов
/ 20 июня 2020

В каком случае printf возвращает отрицательное значение?

Стандарт C говорит (черновик C99):

Функция printf возвращает число переданных символов или отрицательное значение, если произошла ошибка вывода или кодирования

Стандарт POSIX говорит:

Если обнаружена ошибка вывода , эти функции должны возвращать отрицательное значение и устанавливать errno для обозначения ошибки.

...