System函数:
是由fork、execve和waitpid三个系统调用实现的。
例如执行:system("ls /tm") --返回值为256
所以如果execve出错,则直接调用_exit(256),所以变量ret的值等于256.
在system函数执行时,会启动一个子进程运行shell,然后通过将ls /tm作为参数传给shell,如果shell命令运行有错,就调用exit XXX作为system的返回值返回,而XXX是system函数的返回值,而不是shell运行ls /tm后的返回值。
Exit函数:
exit时,退出状态码只能是一个字节,超过部分被截取.
在父进程获取其状态时,把这个字节的数据放在了低地址第二个字节位置了.这些都是对补码操作的.
因此,exit (-1) 和exit (255)时,父进程取的状态码是一样的,你无法区分
因此,我们一般只根据退出状态为0或则非0来判断成功或失败,而不做进一步的区分.
注意:
如果把system的返回值除以256就可以得到真正的返回值了,因为system()返回的结果分两个部分,前面是命令的返回值,后面是运行因为信号终止时的信号值。所以要/256就是这个原因。