2024年4月29日发(作者:)

system函数返回值探究 (2011-12-24 13:41)

标签: system函数 linux 分类: Linux

对于system这个函数的功能早就有一定了解,读书期间,就学习了UNIX系统编程

这本书,后来买了APUE.我这个人总是有好读书不求甚解的毛病。对于system函数只知

其一,不知其二。后来被人问起相关的问题,结果丢了脸。书到用时方恨自己不求甚解。

今天仔细探查了下system的一些特性。

APUE这本书,对system这个函数已经将的比较明白了,只是它的相关知识稍显分

散。最开始我是去网上找的资料,自己写的测试代码,可是还是有很多迷惑的地方。后来

才拿起APUE ,好好读了第八章和第十章的相关章节。

#include

int system(const char *command);

system的作用是在shell终端执行command。简单的说就是在C中执行system("ls")

这行代码的含义就相当于在shell执行ls一样。这么说还是比较笼统,下面详细描述之:

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的终止状态。

上面这些话是APUE的,很抽象,很不具体,很笼统,我现在结合手册和代码解释一

下。

手册中有这么一段话:

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).

1 如果/bin/sh拉起shell命令失败,或者是shell命令没有正常执行 (比如命令根本

就是非法的命令),那么,将原因填入status的8~15位。

手册中也说如果命令执行不起来,那么相当于执行exit