【发布时间】:2016-01-18 23:04:58
【问题描述】:
我正在使用system 命令压缩一些日志文件:
if (system("gzip -f log.csv"))
{
printf("gzip failed");
return;
}
偶尔(非常不一致),我会收到gzip failed 消息,该消息会退出函数并且不执行其他一些取决于 gzip 是否成功的任务。但是,当我在命令行中检查目录时,该文件确实被正确压缩到 log.csv.gz 中(即我可以 gunzip 它 - 即使 system 返回非零,该命令显然也没有失败值)。
这怎么可能?我只是错过了什么吗?
【问题讨论】:
-
查看 gzip 发生时向 stderr 写入的内容。我不知道您希望我们如何在没有日志的情况下告诉您任何有用的信息。
-
...例如,如果在操作期间有任何其他内容更改了其输入文件,您的 gzip 实现可能会以错误状态退出(因为这意味着它无法确定压缩版本与输入的任何版本完全匹配)。
-
顺便说一句,我希望你真正的程序是硬编码日志名称(就像你在这里一样),而不是将任何任意文件名替换为
system()调用。想想如果你有一个使用touch '$(rm -rf ~)'创建的文件,并将该名称替换为对system()的调用会发生什么。 (引用可以使执行一点变得更加困难,但只能通过转义来完全避免......或做正确的事情并通过适当的fork()/ exec()调用您想要的外部程序( ) 使用数组中传递的参数,并非所有参数都在一个字符串中被 shell 解析出来)。 -
this,来自
system()的手册页可能会解释您所看到的:返回的值为 -1 错误(例如,fork(2) 失败),返回状态为否则命令。后一种返回状态采用 wait(2) 中指定的格式。因此,该命令的退出代码将是 WEXITSTATUS(status)。如果 /bin/sh 无法执行,退出状态将是执行 exit(127) 的命令的状态。