My understanding is that I've to shut down the flowgraph when the failure situation is detected, and after that, I have to relaunch it using some OS provided facility, right?
There are several options:
First, you can call
top_block.wait() # every stop() needs a wait()
For some source/sink blocks, this will cause them to usefully reinitialize, but I don't think gr-osmosdr is one of them (if that's what you're using to access your RTL-SDR devices).
Second, you can remove the source block from the flow graph (using disconnect() to reverse the connect() operations), construct a new one, and connect that one in place of the old one. This must be done either between stop() and start() or between lock() and unlock() (these have almost the same effects). Also, if the device requires exclusive access (which is true of RTL-SDR and HackRF), you must make sure the old source block is destroyed before the new one is created — which can take some careful dropping of references, if you're working in Python. I believe this option should be sufficient for your problem.
Third, you can restart the process as you propose. This is the most thorough and simple solution, but of course means that everything else you might be doing in that process is reset.