[GRASS-dev] How to check return code of subprocess in C

Glynn Clements glynn at gclements.plus.com
Tue Feb 4 02:10:03 PST 2014


Vaclav Petras wrote:

> how should the C module check if the subprocess succeeded, i.e. what is
> subprocess return code.
> 
> I just committed fix for r.mode (1) and before the fix, r.mode was
> pretending that everything is all right although it was not (r.reclass
> failed and printed help). Now the r.reclass does not fail and r.mode works,
> however there is still the check of return code missing.
> 
> So, the question is, how to deal with the failed subprocess when using
> G_popen_write and G_popen_close function as in case of r.mode.
> Unfortunately, ./lib/gis/popen.c does not contain any documentation, so
> that's why I'm asking.

Currently, that isn't possible.

Consider replacing G_popen_close() with:

	int G_popen_close(struct Popen *state)
	{
	    if (state->fp)
		fclose(state->fp);
	
	    if (state->pid == -1)
		return -1;
	
	    return G_wait(state->pid);
	}

But bear in mind that the same issue applies to r.rescale, r.mode,
r.statistics, r.coin and the functions in lib/gis/pager.c.

An alternative would be for G_popen_close() to raise a fatal error if
the child process terminates with a non-zero exit status or on a
signal.

FWIW, the Unix pclose() function returns -1 and sets errno in the
event of an error.

Also G_wait (in spawn.c) probably needs:

	else if (WIFSIGNALED(status))
-	    return WTERMSIG(status);
+	    return -WTERMSIG(status);

Currently, there's no way to distinguish between an exit status and a
signal.

-- 
Glynn Clements <glynn at gclements.plus.com>


More information about the grass-dev mailing list