Почему программы иногда «пропускают» printfs? - PullRequest
0 голосов
/ 05 сентября 2011

У меня есть следующий код:

if (!strcmp(ent_child->d_name, "eeprom")){
    printf("\tread_from_driver: found a match! ");//DEBUG
    get_child_path(child_path, child_path, "eeprom");
    printf("The path is: %s\n", child_path);//DEBUG
    read_eeprom(child_path);
}

Это вызывает segfault в некоторый момент (вероятно, get_child_path), но первый printf никогда не происходит, даже когда я исправляю код так:

if (!strcmp(ent_child->d_name, "eeprom")){
    while(1)
         printf("\tread_from_driver: found a match! ");//DEBUG
    get_child_path(child_path, child_path, "eeprom");
    printf("The path is: %s\n", child_path);//DEBUG
    read_eeprom(child_path);
}

Это случается. В чем дело? Это определенно не первый раз, когда я наблюдал такое поведение.

Ответы [ 4 ]

10 голосов
/ 05 сентября 2011

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

3 голосов
/ 05 сентября 2011

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

2 голосов
/ 05 сентября 2011

Только stderr не буферизуется ... stdout буферизуется, и поэтому вы не обязательно будете видеть выходные данные, пока либо не заполнится буфер, либо не встретится символ новой строки, либо вы специально не очистите поток.

Поэтому, если вы хотите распечатать отладочные сообщения, используйте stderr вместо stdout.

2 голосов
/ 05 сентября 2011

поставить \n в конце первого printf, предупреждение об ошибке сегментации удаляет последнюю выходную строку. Я не могу это объяснить, я просто знаю, что если поставить \n, то написано

...