Sometimes external checker cannot get item value - host unavailable or something like this.
If item type is character or text the only way to report about unknown value for external script is sleep and wait until server kill it. Any other action will lead zabbix server to accept and process returned value (including empty string). Function zbx_execute() ignores exit code of executed process.
I think more graceful is assume that external checker should return zero retcode in normal case and treat non-zero retcode as fail (as it is for timeout).
Both windows cmd and unix sh return exit code of executed command as their exit code, it's no problem to check retcode from waitpid().