system返回256

http://blog.chinaunix.net/uid-24774106-id-3048281.html?page=3

遇到system调用脚本,结果返回了256的情况,那么如何判断脚本是否正常成功调用,即取到脚本的真正返回值

system是个综合的操作,分解开来看就是相当于执行了

1 fork  生成一个子进程。
2 在子进程执行 execl("/bin/sh","sh","-c" command,(char*)0);
3 waitpid

下面进入正题,返回值:
1 如果fork失败了,或者waitpid返回除了EINTR之外的错误,system返回 -1;
2 execl执行失败,其返回值如同shell执行了"exit(127)" 一样。(非法命令)
3 如果上述三步都执行成功,那么,system返回值是shell的终止状态。

如果/bin/sh拉起shell命令失败,或者是shell命令没有正常执行 (比如命令根本就是非法的命令),那么,将原因填入status的8~15位。

  1. libin@libin:~/program/C/Linux/system$ ./tsys "nosuchcmd"
  2. sh: nosuchcmd: not found
  3. status = 32512
  4. normal termination,exit status = 127
我们看到了,nosuchcmd不是shell支持的命令,所以,shell命令返回了127,对于system函数,返回值为127*256 = 32512;因为shell的返回值是 system返回值的8~15位。

如果shell顺利执行完毕,那么将shell的返回值填到system返回值的8~15位。
 这里需要强调以下,所谓顺利执行完毕,并不是说,命令command执行成功,而是指  /bin/sh顺利调用,执行期间没有被信号异常终止,这都算是顺利执行完毕。

  1. libin@libin:~/program/C/Linux/system$ ./tsys "ls /noexisted"
  2. ls: 无法访问/noexisted: 没有那个文件或目录
  3. status = 512
  4. normal termination,exit status = 2

  5. libin@libin:~/program/C/Linux/system$ ls /noexist
  6. ls: 无法访问/noexist: 没有那个文件或目录
  7. libin@libin:~/program/C/Linux/system$ echo $?
  8. 2
  9. libin@libin:~/program/C/Linux/system$
我们看到了,虽然/noexist文件并不存在,ls这条命令执行出了错,但是仍然属于shell顺利执行完毕。ls /noexist的错误吗是2,所以,system函数的返回值为 2*256 = 512.

各位可能比较感兴趣的是,如果我知道system的返回值,如何知道我的命令的返回值呢?手册中有这么一句话:
  1. Thus, the exit code of the command will be WEXITSTATUS(status)
    看到了WEXITSTATUS(status),就是command的返回值。当然前提条件是shell命令顺利执行完毕。即
  1. WIFEXITED(status) ! =0

  1.    if(WIFEXITED(status))
  2.         {
  3.          printf("normal termination,exit status = %d\n",WEXITSTATUS(status));
  4.         }


### C语言 `system` 函数返回值256的原因分析 在C语言中,`system` 函数用于调用操作系统命令并执行指定的任务。当该函数返回值256时,通常表示被调用的命令或脚本未能成功完成操作[^1]。具体来说: - **返回值定义**:`system` 的返回值由两部分组成——高字节代表退出状态码(Exit Code),低字节则可能包含信号终止信息或其他附加数据[^3]。 - 如果返回值256,则意味着实际的退出状态码为1(因为 \(256 \div 256 = 1\))。这表明所运行的命令或者脚本存在某种形式的失败。 #### 原因解析 以下是可能导致 `system` 返回值256的一些常见原因及其解释: 1. **Shell 脚本内部逻辑错误** - 当通过 `system` 执行外部 Shell 脚本时,如果脚本本身存在问题(如语法错误、未找到依赖工具等),它会向父进程报告非零的状态码作为其结束标志[^2]。 2. **权限不足** - 若尝试访问受限资源而当前用户缺乏相应权限,也会触发异常行为,并最终反映成非正常的退出代码[^4]。 3. **路径配置不当** - 对于某些特定环境下的应用程序而言,它们可能会依赖一些预设好的变量设置;一旦这些条件缺失就容易造成启动失败进而影响整体流程走向。 #### 解决方案建议 为了有效应对上述提到的各种情况可以采取如下措施: 1. **验证目标指令的有效性** 在正式集成前单独测试待执行语句能否按预期工作无误后再嵌入至项目源码之中去。 2. **增强健壮性的输入校验机制** 针对可能出现非法参数传递给子进程中考虑加入额外层次上的过滤手段减少潜在风险因素干扰正常运转过程. 3. **调整权限设定** 确认所有涉及环节均具备必要授权许可从而保障整个链条顺畅运作下去不受阻碍. 4. **利用管道捕获输出流** 使用像 popen 这样的接口代替原始简单的 system 方法可以获得更精细粒度的结果反馈以便后续处理更加灵活自如些[^4]. ```c #include <stdio.h> #include <stdlib.h> int main(){ FILE *fp; char path[1024]; fp=popen("/path/to/command","r"); if(fp==NULL){ perror("Failed to run command\n"); exit(EXIT_FAILURE); } while(fgets(path,sizeof(path)-1,fp)!=NULL){ printf("%s",path); } pclose(fp); return EXIT_SUCCESS; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值