我想执行一个可执行文件,该文件的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)
是test1
0,则在接收到信号时,如果进程的终止伴随着包含进程图像的核心文件的创建,则评估为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
表示程序退出,退出状态为22
意味着程序被信号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
的大小,或者直接使用文字字符串调用system
:system("./test1")