2013-04-20 1 views
4

При возникновении ошибки я хотел бы, чтобы мой код C сохранял ошибку перед выходом из программы. Рекомендуется ли хранить файл stderr в файле (например, /home/logs.txt) или было бы рекомендовано использовать другой метод для ведения журнала/отчета об ошибке (с учетом среды программирования Linux). Например, для кода ниже, как я мог бы применить метод для хранения сообщения журналов/ошибок на /home/log.txt или /home/logсохранение журналов/сообщение об ошибке при программировании на языке С

FILE *fp1; 
fp1 = fopen("/sys/class/gpio/export","w"); 
if(fp1 == NULL){ 
    fprintf(stderr, "errno:%s - opening GPIO136 failed - line 739\n ", strerror(errno)); 
    close(fp1); 
    exit(1); 
} 

Спасибо.

+1

Вызов 'close()' неверен, поскольку он предназначен для дескрипторов файлов, а не для дескрипторов файлов. Здесь вы должны были показать предупреждение/ошибку компилятора, поскольку вы передаете указатель на то, где ожидается целое число. Однако вызов 'fclose()' был бы лишним, так как файл не был открыт, что обозначается 'fp1'' 'NULL'. – alk

+0

Спасибо, я исправлю его на моем коде – sven

ответ

3

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

$ program 2>~/logs.txt 

Для лучшего каротажного инструмента, вы можете использовать:

  • syslog стандартной функции.

  • log4c библиотека.

+0

'syslog' * не * системный вызов (это не в разделе 2' man'), а стандартная библиотечная функция. Я рекомендую использовать его. –

0

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

Если вы хотите написать в /home/log.txt, откройте указатель FILE и напишите с помощью fprintf так же, как вы пытались открыть/sys/class/gpio/export и записать на него вместо stderr. Также не забудьте открыть файл журнала в режиме добавления.

FILE *fp1; 
fp1 = fopen("/sys/class/gpio/export","w"); 
if(fp1 == NULL){ 
    FILE *fpErr = fopen("/home/log.txt", "a"); 
    if(fpErr != NULL) 
     fprintf(fpErr, "errno:%s - opening GPIO136 failed - line 739\n ", strerror(errno)); 
    close(fpErr); 
    close(fp1); 
    exit(1); 
}