Перенаправить stderr в файл.

Доброго времени суток всем.

Имею проблемку. Поиски в инете дают перенаправку в shell, мне это катайгорически не подходит. Прошу помощи.

Пишу один небольшой проект под linux. И вот какая сложность возникла.
Программа запускается на устройстве (NAS) и терминал есть только уделенный.
для того чтобы не вешать терминал, делаю так:

дык вот. после выполнения fork() stdout и stderr отсоединены от терминала, а где-то в sockSrvFunc() вылезает ошибка. На сегментацию или еще на что-то. И ся программа вылетает. Я даже нашел место где вылетает (отладки нет. Я не смог настроить тулчайн на отладку в виртуалке, а на железке это вообще проблематично). Кроче мне надо напраить stderr в файл, чтобы если по какой ошибке прога терминатилась, оно оставалось в файле.

P.S. компилятор GCC и исходники C, не C++
P.P.S. повторюсь, т.к. По fork мы запускаем параллельную задачу ее stdout и stderr переключены на буфер. В случае штатного завершения (не критичных ошибок в том числе) по завершению демона коммандой через socket это все вываливается в терминал. Но у меня какая-то критичная ошибка. Поток терминейтится и следом убивается основная задача. И в буфер ничего не передается. Оно где-то теряется.

4 комментария

  1. как бы ошибку я отловил, и исправил. но перенаправление нужно. потому как оно будет работать у клиента и если вдруг где что отвалится. чтоб я хотя бы понять мог что случилось. Свое логирование есть (оно и помогло вычленить ошибку). Но какая была ошибка я до конца не понял. и полностью ли ее исключил тоже не знаю просто переписал по-другому код вызывавший вылет

  2. Перенаправление потоков:
    command > stdout 2> stderr
    можно еще сделать 2>&1, тогда ошибки пойдут туда же, куда направил и обычный вывод.

    1. это все для шелла, А мне надо из самой проги.
      Когда запускается fork(), та часть проги что в новом экземпляре задачи (для которой fork() возвратит 0 )
      отрубается от вывода, в частности от stderr. И даже если я запущу это так : myprog > lo.txt 2>errlog.txt в них тишина будет.
      По крайней мере на этом железе. Вот мне и надо внутри программы stderr перенапраить.

  3. Я не спец в программировании, но вот что выдал мне гугл:
    http://www.unix.com/programming/136615-using-execl-pipes-grab-stderr-output-stdout.html

    и вот это

    http://jineshkj.wordpress.com/2006/12/22/how-to-capture-stdin-stdout-and-stderr-of-child-program/

    Как я понимаю, тебе надо перенаправить дискрипторы в пайп, чтоб пользоваться ими в чайлдах.

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *