system返回值

例:

status = system("./test.sh");

1、正确退出后。还需要再判断,操作成功或者操作失败。

2、错误退出。

1、先统一两个说法:
(1)system返回值:指调用system函数后的返回值,比如上例中status为system返回值
(2)shell返回值:指system所调用的shell命令的返回值,比如上例中,test.sh中返回的值为shell返回值。

2、如何正确判断test.sh是否正确执行?
仅判断status是否==0?或者仅判断status是否!=-1?

都错!

3、man中对于system的说明

RETURN VALUE
       The value returned is -1 on error (e.g.  fork() 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).
看得很晕吧?

system函数对返回值的处理,涉及3个阶段:
阶段1:创建子进程等准备工作。如果失败,返回-1。
阶段2:调用/bin/sh拉起shell脚本,如果拉起失败或者shell未正常执行结束(参见备注1),原因值被写入到status的低0~7比特位中。system的man中只说明了会写了127这个值,但实测发现还会写126等值。低8bit为0
阶段3:如果shell脚本正常执行结束,将shell返回值填到status的高8~15比特位中。
备注1:
只要能够调用到/bin/sh,并且执行shell过程中没有被其他信号异常中断,都算正常结束。
比如:不管shell脚本中返回什么原因值,是0还是非0,都算正常执行结束。即使shell脚本不存在或没有执行权限,也都算正常执行结束。
如果shell脚本执行过程中被强制kill掉等情况则算异常结束。

如何判断阶段2中,shell脚本是否正常执行结束呢?系统提供了宏:WIFEXITED(status)。如果WIFEXITED(status)为真,则说明正常结束。
如何取得阶段3中的shell返回值?你可以直接通过右移8bit来实现,但安全的做法是使用系统提供的宏:WEXITSTATUS(status)。


由于我们一般在shell脚本中会通过返回值判断本脚本是否正常执行,如果成功返回0,失败返回正数。
所以综上,判断一个system函数调用shell脚本是否正常结束的方法应该是如下3个条件同时成立:
(1)-1 != status
(2)WIFEXITED(status)为真 低8bit为0
(3)0 == WEXITSTATUS(status)  高8bit为0

注意:
根据以上分析,当shell脚本不存在、没有执行权限等场景下时,以上前2个条件仍会成立,此时WEXITSTATUS(status)为127,126等数值。
所以,我们在shell脚本中不能将127,126等数值定义为返回值,否则无法区分中是shell的返回值,还是调用shell脚本异常的原因值。shell脚本中的返回值最好多1开始递增。

判断shell脚本正常执行结束的健全代码如下
 

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
 
int main()
{
    pid_t status;
 
 
    status = system("./test.sh");
 
    if (-1 == status)
    {
        printf("system error!");
    }
    else
    {
        printf("exit status value = [0x%x]\n", status);
 
        if (WIFEXITED(status))// //正确退出
        {
            if (0 == WEXITSTATUS(status))//操作成功
            {
                printf("run shell script successfully.\n");
            }
            else
            {
                printf("run shell script fail, script exit code: %d\n", WEXITSTATUS(status));
            }
        }
        else
        {
            printf("exit status = [%d]\n", WEXITSTATUS(status));
        }
    }
 
    return 0;
}

WIFEXITED(stat_val) Evaluates to a non-zero value if status
was returned for a child process that
terminated normally.

WEXITSTATUS(stat_val) If the value of WIFEXITED(stat_val) is
non-zero, this macro evaluates to the
low-order 8 bits of the status argument
that the child process passed to _exit()
or exit(), or the value the child
process returned from main().
---------------------  
作者:cheyo车油  
来源:CSDN  
原文:https://blog.csdn.net/cheyo/article/details/6595955  
版权声明:本文为博主原创文章,转载请附上博文链接!

### 回答1: 在 Python 中,os.system(command) 函数执行指定的 shell 命令,并返回命令执行的状态码。如果命令执行成功,则返回 0,否则返回非零值。如果命令无法执行,则返回 -1。同时,该函数会直接在终端中打印出命令的输出结果。如果需要获取命令的输出结果,可以使用 subprocess 模块中的函数。 ### 回答2: os.system()是Python中用于执行系统命令的函数,它会调用操作系统的shell来执行指定的命令,并返回一个表示执行结果的返回值。 当os.system()执行成功时,返回值为0,表示命令执行成功完成。这意味着系统命令已经顺利执行,并且不会返回任何错误信息。 如果os.system()执行失败,返回值为非零整数。返回值通常可以表示不同类型的错误或异常情况。具体的返回值与不同的操作系统和执行的命令有关。 需要注意的是,os.system()只返回命令的退出状态码,而不包括命令的输出结果。如果需要获取命令的输出结果,可以使用其他方法,比如subprocess模块中的函数。 总之,os.system()的返回值可以让我们判断执行命令是否成功,以及获取执行结果的状态信息。 ### 回答3: os.system()函数是Python标准库中的一个函数,它用于执行操作系统的命令。它接受一个命令作为参数,并在操作系统中执行该命令。该函数的返回值是命令执行的状态码。 当命令成功执行时,os.system()函数的返回值为0。这表示命令执行成功并且没有出现错误。如果命令执行失败或者出现错误,os.system()函数的返回值将是一个非零的整数。这个返回值有助于我们判断命令执行的结果。 我们可以根据os.system()的返回值来判断命令是否执行成功。例如,如果我们执行一个命令并希望根据结果进行不同的操作,我们可以使用条件语句来判断os.system()的返回值。 需要注意的是,os.system()函数在某些操作系统上可能会以不同的方式工作。因此,在使用这个函数时,我们需要考虑到不同操作系统的差异带来的影响。 为了更好地控制执行命令的结果,我们还可以使用subprocess模块中的更强大的函数来代替os.system()函数。subprocess模块提供了更高级的接口,可以更灵活和安全地执行系统命令,并获取其输出及错误信息。 总而言之,os.system()函数返回的是命令执行的状态码,用于判断命令是否执行成功。我们可以根据这个返回值来进行后续的操作,并注意不同操作系统的差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值