Reputation: 1121
I am writing a C program for an embedded Linux (debian-arm) device. In some cases, e.g. if a fatal error occurs on the system/program, I want the program to reboot the system by system("reboot");
after logging the error(s) via syslog()
. My program includes multithreads
, UDP sockets
, severalfwrite()/fopen()
, malloc()
calls, ..
I would like to ask a few question what (how) the program should perform processes just before rebooting the system apart from the syslog
. I would appreciate to know how these things are done by the experienced programmers.
Is it necessary to close the open sockets (UDP) and threads just before rebooting? If it is the case, is there a function/system call that closes the all open sockets and threads? If the threads needs to be closed and there is no such global function/call to end them, how I suppose to execute pthread_exit(NULL);
for each specific threads? Do I need go use something like goto
to end the each threads?
How should the program closes files that fopen
and fwrite
uses? Is there a global call to close the files in use or do I need to find out the files in use manually then use fclose
for the each file? I see see some examples on the forums fflush()
, flush()
, sync()
,.. are used, which one(s) would you recommend to use? In a generic case, would it cause any problem if all of these functions are used (although these could be used unnecessary)?
It is not necessary to free
the variables that malloc
allocated space, is it?
Do you suggest any other tasks to be performed?
Upvotes: 2
Views: 1140
Reputation: 140748
The system automatically issues SIGTERM
signals to all processes as one of the steps in rebooting. As long as you correctly handle SIGTERM
, you need not do anything special after invoking the reboot
command. The normal idiom for "correctly handling SIGTERM
" is:
SIGTERM
writes one byte (any value will do) to that pipe.select
loop includes the read end of that pipe in the set of file descriptors of interest. If that pipe ever becomes readable, it's time to exit.Furthermore, when a process exits, the kernel automatically closes all its open file descriptors, terminates all of its threads, and deallocates all of its memory. And if you exit cleanly, i.e. by returning from main
or calling exit
, all stdio FILE
s that are still open are automatically flushed and closed. Therefore, you probably don't have to do very much cleanup on the way out -- the most important thing is to make sure you finish generating any output files and remove any temporary files.
You may find the concept of crash-only software useful in figuring out what does and does not need cleaning up.
Upvotes: 2
Reputation: 44191
The only cleanup you need to do is anything your program needs to start up in a consistent state. For example, if you collect some data internally then write it to a file, you will need to ensure this is done before exiting. Other than that, you do not need to close sockets, close files, or free all memory. The operating system is designed to release these resources on process exit.
Upvotes: 2