system()和popen()不可用

时间:2014-03-14 10:55:48

标签: c++ linux bash busybox

我需要在Linux机器上运行C ++代码的shell脚本。我尝试过使用system()和popen()函数。当我在dev机器上测试它们一切正常时,但是当我在实际设备上尝试相同的功能时 - 我得到错误127.从信息到目前为止它意味着,脚本解释器不可用,但实际上机器已经安装了busybox翻译在里面。我可以通过命令行运行相同的命令 - 完全没问题。当我尝试从代码中执行此操作时:

Command: sh -n '/home/test/test.sh' Status: 127

这种行为可能是什么原因? 我有可能达到某种内核限制吗?

代码示例1:

int Files::CallShell( std::string& command )
{
    int status = 0;
    char buff[512] = { 0 };
    FILE *in;

    if ( !(in = popen( command.c_str(), "r") ) )
    {
        printf( "Can't execute: %s\n", command.c_str() );
        status = -1;
    }

    while ( fgets( buff, sizeof(buff), in) != NULL )
    {
        printf( "Result: %s\n", buff );
    }

    status = pclose( in );
    status = ( WIFEXITED( status ) )? WEXITSTATUS( status ) : status;

    printf("Command: %s Status: %d\n", command.c_str(), status );

    return status;
} 

代码示例2:

int Files::CallShell2( std::string& command )
{
    int status = 0;

    status = system( command.c_str() );
    status = ( WIFEXITED( status ) )? WEXITSTATUS( status ) : status;
    printf("Command: %s Status: %d\n", command.c_str(), status );

    return status;
} 

2 个答案:

答案 0 :(得分:0)

system()库函数执行/bin/sh -c以运行传递的命令。如果/bin/sh不存在,或者ash未以相同方式解析参数,则会出现此错误。您可以将/bin/sh/bin/ash关联起来,也可以更好地使用system()fork()系列函数之一实现您自己的exec版本,可以调用ash而不是sh

答案 1 :(得分:-1)

“-n”开关用于检查shell脚本的语法...如果未设置“-i”。检查shell的手册页。至于退出状态检查。从手册页:

  

退出状态

     

shell检测到的错误(例如语法错误)将导致错误   shell以非零退出状态退出。如果shell不是   交互式shell,shell文件的执行将被中止。 Oth-   错误的shell将返回最后一个命令exe的退出状态   如果出口内置与数字参数一起使用,它将会   返回论点。