system()返回非零但仍执行操作

时间:2016-01-18 23:04:59

标签: c linux

我正在使用system命令来压缩一些日志文件:

if (system("gzip -f log.csv"))
{
      printf("gzip failed");
      return;  
}

偶尔(非常不一致),我会收到一条gzip failed消息,该消息退出该函数并且不执行一些其他任务,这些任务取决于gzip是否成功。然而,当我在命令行检查目录时,文件确实正确地被压缩到log.csv.gz(即我可以gunzip它 - 即使{{1},命令显然也没有失败返回非零值。)

这怎么可能?我只是错过了一些东西吗?

3 个答案:

答案 0 :(得分:4)

根据这个guide,退出代码为2的gzip意味着它有一个警告。这意味着它可能产生输出但可能不正确?

答案 1 :(得分:3)

绝对没有要求具有非零退出状态的程序会回滚它在错误之前执行的所有操作,从而导致该状态。事实上,这样的行为往往是不可能的或破坏性的。

因此,任何命令都可以返回非零退出状态但仍然对系统状态产生影响。

答案 2 :(得分:1)

我做了一些调查,似乎gzip失败的根本原因似乎是两个waidpid调用之间的竞争条件:system()本身中的一个,另一个是自定义SIGCHLD处理程序中的某个代码中的其他内容(这是一个巨大的数千行进程)。

如果自定义SIGCHLD处理程序收集了子(gzip),则system()返回-1(因为它的waidpid失败),否则system()会按预期返回0。

这是帮助我最终解决问题的SO帖子:

C++: system(0) Returns 0