如何在unix的c程序中得到system()调用的返回值
2010-03-11 18:23
417 查看
结论:
char cmd[128];
...
int
status = system(cmd);
printf("%d == system(/"%s/");/n", WEXITSTATUS(status), cmd); //打印返回值
网上搜到的答案与解释(1):
http://www.lslnet.com/linux/dosc1/38/linux-280268.htm
如何在unix c程序中得到system调用的返回值,请指教
对 system
的返回值施加 WEXITSTATUS
宏。结果就是。
如何在unix c程序中得到system调用的返回值,请指教
看看这条FAQ:
1.10 system函数,pclose函数,waitpid函数
的返回值是什么?
==========================================================
‘system()’,‘pclose()’或者‘waitpid()’的返回值不象是我进程的退出值(exit
value)(译者注:退出值指调用exit()
或_exit()时给的参数)...
或者退出值左移了8
位...这是怎么搞的?
手册页是对的,你也是对的!
如果查阅手册页的‘waitpid()’你会发现进程的返回
值被编码了。正常情况下,进程的返回值在高16位,而余下的位用来作其它事。
如果你希望可移植,你就不能凭借这个,而建议是你该使用提供的宏。这些宏总
是在‘wait()’或‘wstat’的文档中说明了。
为了不同目的定义的宏(在‘<sys/wait.h>;’)包括(stat是‘waitpid()’返回的值):
`WIFEXITED(stat)'
如果子进程正常退出则返回非0
`WEXITSTATUS(stat)'
子进程返回的退出码
`WIFSIGNALED(stat)'
如果子进程由与信号而
终止则返回非0
`WTERMSIG(stat)'
终止子进程的信号代码
`WIFSTOPPED(stat)'
如果子进程暂停(stopped)则返回非0
`WSTOPSIG(stat)'
使子进程暂停的信号代码
`WIFCONTINUED(stat)'
如果状态是表示子进程继续执行则返回非0
`WCOREDUMP(stat)'
如果‘WIFSIGNALED(stat)’为非0,而如果这个进程产生一个内存映射文件
(core dump)则返回非0
网上搜到的答案与解释(2):
(1)刚用到system函数,要根据其返回值来做进一步操作,可是system的返回值并不等于其调用的程序的返回值,man了没看懂,后来在网上搜索了一下,终于看到了一个DX的理解,记录之。
引自:原文
要分成两部分来说:
1,在程序中,用exit来设置进程的退出值时,虽然该函数的参数类型为int型,但再父进程中只能取到其值的低8位.所以用exit返回值时,高于255的值是没有意义的.
2,对于system函数,返回值是由两部分组成的,低8位值表示所执行的脚本在执行过程中所接收到的信号值,其余的位表示的脚本exit退出时所设置的值,
即脚本内exit退出是的值的低8位,在system返回值的低9-16位
这样我们就可以通过右移操作来得到exit的值了。
char cmd[128];
...
int
status = system(cmd);
printf("%d == system(/"%s/");/n", WEXITSTATUS(status), cmd); //打印返回值
网上搜到的答案与解释(1):
http://www.lslnet.com/linux/dosc1/38/linux-280268.htm
如何在unix c程序中得到system调用的返回值,请指教
对 system
的返回值施加 WEXITSTATUS
宏。结果就是。
如何在unix c程序中得到system调用的返回值,请指教
看看这条FAQ:
1.10 system函数,pclose函数,waitpid函数
的返回值是什么?
==========================================================
‘system()’,‘pclose()’或者‘waitpid()’的返回值不象是我进程的退出值(exit
value)(译者注:退出值指调用exit()
或_exit()时给的参数)...
或者退出值左移了8
位...这是怎么搞的?
手册页是对的,你也是对的!
如果查阅手册页的‘waitpid()’你会发现进程的返回
值被编码了。正常情况下,进程的返回值在高16位,而余下的位用来作其它事。
如果你希望可移植,你就不能凭借这个,而建议是你该使用提供的宏。这些宏总
是在‘wait()’或‘wstat’的文档中说明了。
为了不同目的定义的宏(在‘<sys/wait.h>;’)包括(stat是‘waitpid()’返回的值):
`WIFEXITED(stat)'
如果子进程正常退出则返回非0
`WEXITSTATUS(stat)'
子进程返回的退出码
`WIFSIGNALED(stat)'
如果子进程由与信号而
终止则返回非0
`WTERMSIG(stat)'
终止子进程的信号代码
`WIFSTOPPED(stat)'
如果子进程暂停(stopped)则返回非0
`WSTOPSIG(stat)'
使子进程暂停的信号代码
`WIFCONTINUED(stat)'
如果状态是表示子进程继续执行则返回非0
`WCOREDUMP(stat)'
如果‘WIFSIGNALED(stat)’为非0,而如果这个进程产生一个内存映射文件
(core dump)则返回非0
网上搜到的答案与解释(2):
(1)刚用到system函数,要根据其返回值来做进一步操作,可是system的返回值并不等于其调用的程序的返回值,man了没看懂,后来在网上搜索了一下,终于看到了一个DX的理解,记录之。
引自:原文
要分成两部分来说:
1,在程序中,用exit来设置进程的退出值时,虽然该函数的参数类型为int型,但再父进程中只能取到其值的低8位.所以用exit返回值时,高于255的值是没有意义的.
2,对于system函数,返回值是由两部分组成的,低8位值表示所执行的脚本在执行过程中所接收到的信号值,其余的位表示的脚本exit退出时所设置的值,
即脚本内exit退出是的值的低8位,在system返回值的低9-16位
这样我们就可以通过右移操作来得到exit的值了。
相关文章推荐
- .NET中如何在调用COM时得到返回参数值System.Type.InvokeMember的使用
- erlang调用外部程序如何得到其退出状态
- C: Run a System Command and Get Output? 在C程序中调用工具,并且得到结果。
- NET中如何在调用COM时得到返回参数值
- 如何调用命令行程序, 并得到输出, 还有输入交互?
- .NET中如何在调用COM的时候得到返回参数值
- .NET中如何在调用COM时得到返回参数值
- system函数返回(如何判断调用的shell命令是否执行成功)
- .NET中如何在调用COM的时候得到返回参数值 (转)
- JAVA如何调用对方http接口得到返回数据
- 如何禁止程序调用IE浏览器(防止网"转"/辅助类工具弹广告)
- 如何在C++中调用C程序?
- 【转载】VC中如何调用其他的可执行程序
- 不用ide编译java程序时如何调用jar包
- 如何在linux内核中调用用户空间的程序
- system 调用 Qt 程序的问题
- 如何在java程序中调用linux命令或者shell脚本?
- 如何在ASP.NET程序中弹出新窗口并得到返回值
- 调用命令行程序并获取返回信息
- 如何在LINUX/UNIX上运行PYTHON程序