why does close() fail miserably on popen with exit code -1 ?!

Jeffrey Schwab jeff at schwabcenter.com
Mon Feb 20 16:26:10 EST 2006


Atanas Banov wrote:
> i ran onto this weirdness today: seems like close() on popen-ed
> (pseudo)file fails miserably with exception instead of returning exit
> code, when said exit code is -1.
> 
> here is the simplest example (under Windows):
> 
> 
>>>>print popen('exit 1').close()
> 
> 1
> 
>>>>print popen('exit -1').close()
> 
> Traceback (most recent call last):
>   File "<interactive input>", line 1, in ?
> IOError: (0, 'Error')
> 
>>>>print popen('exit -2').close()
> 
> -2
> 
> has anyone have idea why is that?

_PyPclose returns the exit status of the popened process (the popenee?), 
or -1 on error.  Of course, if the status is supposed to be -1, there's 
some confusion.

In the snippet of code below (from Modules/posixmodule.c), result has 
been initialized to the output of fclose, which in your case is 0.  The 
comment is particularly handy.

	if (result != EOF &&
	    waitpid(pipe_pid, &exit_code, 0) == pipe_pid)
	{
		/* extract exit status */
		if (WIFEXITED(exit_code))
		{
			result = WEXITSTATUS(exit_code);
		}
		else
		{
			errno = EPIPE;
			result = -1;
		}
	}
	else
	{
		/* Indicate failure - this will cause the file object
		 * to raise an I/O error and translate the last
		 * error code from errno.  We do have a problem with
		 * last errors that overlap the normal errno table,
		 * but that's a consistent problem with the file object.
		 */
		result = -1;
	}



More information about the Python-list mailing list