The problem is not that the *ports* are not closed (they are), but that the other *files* (that are not port) are not closed.
When a program exec another one, it's supposed to close all files but 0, 1 and 2. open-process only closes the ports, so if you have other files opened (that you have opened from C for instance) these files will be communicated to the new process, which is not the intended behavior. I state that open-process should _not_ try to close *ports*, but should close all *files* (but 0, 1 and 2) instead.