It depends entirely on what your program is doing but I would say something like this:
A graceful shutdown means that any "started" I/O operations (e.g. file reads, HTTP request/responses, etc.) should complete but no new ones can be started. So your shutdown handler should prevent the possibility of starting any new operations (e.g. unbind any port listeners, prevent any new fs calls, etc.), ensure that any currently running handlers run to completion, and then exit the process.
[Edit] Of course, if your application doesn't care about the above concerns then there really isn't anything to do. When the process exits all open file/socket handles will be closed automatically so there are no problems with leaked resources.