博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux system 函数的一些注意事项
阅读量:5239 次
发布时间:2019-06-14

本文共 2886 字,大约阅读时间需要 9 分钟。

 

 

 

在日常的代码编程中 , 我们可以利用system  函数去调用一些我们自己想调用的命令 , 并获取他的返回值。

函数的原型如下:

  int system(const char *command);

 

上一段我自己写的代码:

1 int main(void)                                                                   2 {                                                                                3     unsigned  int val ;                                                          4                                                                                  5     val = system("./a.out") ;                                                    6                                                                                  7     val = WEXITSTATUS(val);                                                      8     printf("vl = %d\n" , val) ;                                                  9                                                                                 10     return 0 ;                                                                  11 }

 

这段代码是直接调用了当前文件的a.out文件 , 并获取了他的返回值.

今天着重记一下这个返回值得注意事项,先看下man system  里面关于返回值的说明:

RETURN VALUE       The value returned is -1 on error (e.g.  fork(2) failed), and the  return       status  of  the  command  otherwise.  This latter return status is in the       format specified in wait(2).  Thus, the exit code of the command will  be       WEXITSTATUS(status).   In  case  /bin/sh  could not be executed, the exit       status will be that of a command that does exit(127).       If the value of command is NULL, system() returns nonzero if the shell is       available, and zero if not.       system() does not affect the wait status of any other children.

 

返回值分为3类, 

第一类 : 如果 system 分配子进程失败, 他会返回 -1;

第二类 :  如果 system  执行命令失败 , 返回127;

第三类 : 执行命令子进程命令成功 , 返回子进程所返回的值。

 

这个值是有问题的。这个值是一个16位的值。

低8位 , 存放的是如果你执行命令失败,所存放的值(127 == 7个1),

高8位, 存放的是你执行的那条命令所返回值。

就是这个8位的问题,让我着重讲一下:

通过上面的程序 , 我用了一个宏定义:

val = WEXITSTATUS(val);

 

这个直接左移动8位。

注意这个值只有八位 , 如果你的命令返回一个高于八位的值, 他就会出现我们无法避免的一个状况, 返回值有点不符我们的理想:

看一下我的 a.out  源代码:

1 int main(void)                                                                  2 {                                                                               3     printf("hello kitty \n") ;                                                  4     return 255 ;                                                                5 }

这里我的返回值是255, 看我执行一下system 那个程序 , 得出结果:

aplex@aplex:~/test/chen_test$ ./test hello kitty vl = 255

 

返回值正常 , 但是, 我再把返回值加1:

1 int main(void)                                                                  2 {                                                                               3     printf("hello kitty \n") ;                                                  4     return 256 ;                                                                5 }

 

再执行system 函数代码:

aplex@aplex:~/test/chen_test$ ./test hello kitty vl = 0

 

没错, 他只能返回0~255 的值, 超出8位就不能正常返回。

 

转载于:https://www.cnblogs.com/chenfulin5/p/5755478.html

你可能感兴趣的文章
剑指offer——python【第38题】二叉树的深度
查看>>
Log4Net日志组件使用
查看>>
Windows 10 使用压缩包安装MySQL8.0.12
查看>>
bzoj 1689: [Usaco2005 Open] Muddy roads 泥泞的路
查看>>
Android 代码库(自定义一套 Dialog通用提示框 )
查看>>
[Java]ArrayList、LinkedList、Vector、Stack的比较
查看>>
我为什么要写博客,写博客给我带来了什么?
查看>>
Furure的简单介绍和使用
查看>>
jsp 监听器
查看>>
Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)...
查看>>
软件工程概论-作业之二
查看>>
豆瓣酱alpha版本发布了
查看>>
使用JavaMail发送邮件
查看>>
Netty - 1
查看>>
不要在using语句中调用WCF服务
查看>>
html文本框大全
查看>>
数据库架构
查看>>
生成jFinal的动态条件查询语句的工具类
查看>>
避免构造/析构函数调用虚函数(转)
查看>>
tornado中使用Mako模版
查看>>