2012-01-20 23 views
2

我应该如何检查系统命令是否成功运行并且没有返回错误? 根据MSDN Library,有多种情况。我无法确定下列代码段是否正确。如何检查系统()结果

char buffer[100]; 
int ret_val; 
strcpy(buffer, "copy *.txt "); 
strcat(buffer, path); 
ret_val = system(buffer); 
if(0 != ret_val) 
{ 
    perror("There was an error"); 
} 
else 
{ 
    printf("The command was run successfully."); 
} 

返回值

如果命令是NULL和命令解释被发现,返回一个非零值。如果未找到命令解释程序,则返回0并将errno设置为ENOENT。如果command不是NULL,则系统返回由命令解释器返回的值。仅当命令解释程序返回值0时,才会返回值0.返回值-1表示错误,且errno设置为以下值之一:

+0

[如何获取系统运行的命令的状态()]的可能的重复(http://stackoverflow.com/questions/8941691/how-to-get-the-status-of-command-run-by -system) –

+0

切勿使用'system'。使用它编写安全,可靠的代码几乎是不可能的。 –

回答

1

要捕获所有情况,还需要检查errno,如文档状态:

if (ret_val == 0 && errno == 0) 
{ 
    printf("success!\n"); 
} 

请确保您还明确errno只是打电话system()之前。

+0

这不是真的有效。我把一个文件,它不能删除,并按照你的建议运行。在Visual Studio 2008的Autos窗口中,我看到“_errno返回0x00400808”。但它也是如此陈述。 :( – mustafa

+0

** man 3系统表示:**返回值 返回的值在错误时为-1(例如,fork()失败),并且返回 否则为返回状态,后者的返回状态为 格式因此,该命令的退出代码将为 为WEXITSTATUS(状态)。如果/ bin/sh不能执行, 退出状态将是退出命令的状态(127) 。 –

+0

@Pete Wilson and for Windows? – mustafa

0

由于system的参数不为NULL,因此您将注意力集中在一个非常简单的情况:-1system函数失败,否则返回实际命令的代码。

+0

我发现在某些情况下,'system'正在返回'1' – mustafa

+0

@ mustafa然后这是实际的命令(在你的情况下是'copy'),退出时返回代码 –

+0

是的,它可能是。编辑一个它无法删除的文件。在控制台输出“进程无法访问文件,因为它正在被另一个进程使用。”但'system'仍然返回'0' – mustafa