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



我想执行一个可执行文件,该文件的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: %dn", system(command));
    return 0;
}

CCD_ 2为

#include <stdio.h>
int main(void)
{
    printf("test1 has been executed and its return value is 2n");
    return 2;
}

这就是我得到的

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

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

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

status实际上嵌入了很多信息:

来自系统(3(手册页:

以下宏可用于测试过程前三个宏中的一个将计算为非零(真(值:

WIFEXITED(status)

如果进程通过调用_exit(2(或exit(3(正常终止,则为True

WIFSIGNALED(status)

如果处理由于接收到信号而终止,则为CCD_ 8。

WIFSTOPPED(status)

如果进程尚未终止,但已停止并且可以重新启动,则为True
只有当等待调用指定WUNTRACED选项,或者是否正在跟踪子进程(请参阅ptrace(2((。

根据这些宏的值,以下宏产生关于子进程的剩余状态信息:

WEXITSTATUS(status)

如果WIFEXITED(status)true,则计算为子级传递给_exit(2(或exit(3(的参数的低阶8位。

WTERMSIG(status)

如果WIFSIGNALED(status)true,则评估导致进程终止。

WCOREDUMP(status)

如果WIFSIGNALED(status)test10,则在接收到信号时,如果进程的终止伴随着包含进程图像的核心文件的创建,则评估为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: %dn", WEXITSTATUS(status));
    }
    else if (WIFSIGNALED(status)) {
          printf("The program exited because of signal (signal no:%d)n", WTERMSIG(status));
    } 
    return 0;
}

报价man 3 system:

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

CCD_ 29表示CCD_ 31(3(返回的CCD_。

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

注意,由于后面的NUL,字符串./test1需要8个字符。您的strcpy正在破坏command之外的一些内存。修复:

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

当然,一开始就没有理由复制。

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

甚至

system("./test1")

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

相关内容

  • 没有找到相关文章

最新更新