Re: String formatting in signal handler

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2012/10/20, Randi Botse <nightdecoder@xxxxxxxxx>:
> Hi List,
>
> Almost (maybe all) function from the standard library stdio.h and
> string.h are not safely to be called by signal handler. If so, how to
> format string in a signal handler?. I want to log some signals which
> sent to my program, the contents is for example: time, the signal
> number itself, etc, and then write it to a file.
>
> Regards.
> --
> To unsubscribe from this list: send the line "unsubscribe
> linux-c-programming" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>


Hi,

You can only call safely system calls listed in man 7 signal. write is
one of them. So you can reimplement some snprintf and write it.
But I wouldn't recommend that for several reasons.
1) The most important thing is that you should not call any syscall
inside a signal handler because :
1.1) a syscall may be blocking and thus preventing your program to run
and to handle those signals
1.2) a syscall usually have side effects, which might create a race
condition with respect to the main program. Especially, it modify
errno, and your main program may be preempted just between a syscall
and a test to errno.
2) You may need a buffer to implement your formatting and cannot call
malloc nor brk.
3) You need a loop! If you receive several signal at the same time,
you get notified only once. There is no signal counter.

So, you may still do your processing inside the signal handler if you
take care of all these points (and thoses I forgot). But I would
recommend that your handler set a (volatile) flag to 1 and you do not
use SA_RESTART. Thus, every time a signal is raised, the blocking
syscall will fail with EAGAIN and  you can do your work inside your
main program without any limitation.
Thought you still have to take care of these points:
1) the flag MUST be volatile ;
2) you MUST loop because you may have received several signals ;
3) in order to lower the risk of race conditions, you MUST block the
signal from the time you test the flag to the time you've finished
your processing and reset the flag to 0.
4) If you have several syscalls in the main program, I'd suggest you
block the interesting signal almost every time, and you unblock it
only when you're about to perform some syscall you know they will be
long.


Celelibi
--
To unsubscribe from this list: send the line "unsubscribe linux-c-programming" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Assembler]     [Git]     [Kernel List]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [C Programming]     [Yosemite Campsites]     [Yosemite News]     [GCC Help]

  Powered by Linux