system()的返回值不是执行程序的返回值

时间:2014-07-17 18:25:14

标签: c return main

我想执行一个可执行文件,其main()使用system()返回2。 这就是我所做的

#include <stdio.h>
#include <string.h>

int main(int argc, char *agrv[])
{
    char command[7];
    strcpy(command, "./test1");
    printf("The return value: %d\n", system(command));

    return 0;
}

test1

#include <stdio.h>

int main(void)
{
    printf("test1 has been executed and its return value is 2\n");

    return 2;
}

这就是我得到的

test1 has been executed and its return value is 2
The return value: 512

我的问题是为什么我得到512

3 个答案:

答案 0 :(得分:6)

引用man 3 system

  

错误时返回的值为-1(例如fork(2)失败),否则返回命令的返回状态。后一种返回状态采用wait(2)中指定的格式。因此,命令的退出代码为WEXITSTATUS(status)

man 2 wait显示status(3)返回的system中包含的其他信息。

  • 512表示退出状态为2的程序退出。
  • 2意味着程序被信号2(SIGINT)杀死。

请注意,由于尾随NUL,字符串./test1需要8个字符。你的strcpy正在摧毁command之外的一些记忆。修正:

char command[8];
strcpy(command, "./test1");

当然,首先没有理由复制。

const char* command = "./test1";
system(command)

甚至

system("./test1")

答案 1 :(得分:5)

系统的返回值实际上是POSIX下的waitpid()的返回值。

status实际上嵌入了大量信息:

从system(3)手册页:

  

以下宏可用于测试退出的方式   处理。前三个宏中的一个将评估为非零   (true)值:

     

WIFEXITED(status)

     

True如果通过调用_exit(2)或exit(3)正常终止进程。

     

WIFSIGNALED(status)

     

True如果流程因收到信号而终止。

     

WIFSTOPPED(status)

     

True如果进程尚未终止,但已停止并且可以重新启动   仅当等待调用指定了此宏时,此宏才可以为true   WUNTRACED选项或正在跟踪子进程(请参阅ptrace(2))。

     

根据这些宏的值,会生成以下宏   有关子进程的其余状态信息:

     

WEXITSTATUS(status)

     

如果WIFEXITED(status)true,则计算子项传递给_exit(2)或退出(3)的参数的低8位。

     

WTERMSIG(status)

     

如果WIFSIGNALED(status)true,则计算导致该信号的信号编号   终止过程。

     

WCOREDUMP(status)

     

如果WIFSIGNALED(status)true,如果过程终止伴随着收到信号时创建包含过程图像的核心文件,则评估为真。

     

WSTOPSIG(status)

     

如果WIFSTOPPED(status)true,则计算导致该过程停止的信号编号。

解决方案

#include <stdio.h>
#include <string.h>
#include <limits.h>

int main(int argc, char *argv[])
{
    int status;
    char command[PATH_MAX]; /* PATH_MAX is defined in sys/syslimits.h, included by limits.h */
    strcpy(command, "./test1");
    status = system(command);
    if ( WIFEXITED(status) ) {
          printf("The return value: %d\n", WEXITSTATUS(status));
    }
    else if (WIFSIGNALED(status)) {
          printf("The program exited because of signal (signal no:%d)\n", WTERMSIG(status));
    } 
    return 0;
}

答案 2 :(得分:0)

事实上,这是未定义的行为。 command只包含7个字符,但您的字符串"./test1"有8个,包括空终止符。您需要增加command的大小,或者直接使用文字字符串调用systemsystem("./test1")