Found the problem, but am not sure how to fix it.
When I start calibre and do copies, I am only asked once. If I go into preferences, do nothing, and press OK, I am from that point asked twice. If I go into preferences again and click OK again, I am now asked 3 times.
--- enter geek mode ---

The problem arises because the the accept branch in gui2.ui.do_config calls create_device_menu(), which seems to register the signal handler again. Somehow the existing signal handlers must be deleted. My guess is each of the instances of DeviceMenu are being held because they are referenced by an event handler. The fix might be to disconnect the existing handlers if _sync_menu is not None, but as this kind of thing is out of my league, I am not at all certain.
--- exit geek mode ---