系统通话超时?

时间:2010-06-07 19:57:53

标签: c unix system-calls

我正在使用unix system()调用gunzip和gzip文件。对于有时非常大的文件(即在集群计算节点上),这些文件被中止,而其他时间(即在登录节点上)它们通过。系统调用可能需要一些软限制吗?还有什么呢?

5 个答案:

答案 0 :(得分:1)

调用线程应无限期阻塞,直到您使用system()启动的任务完成。如果您正在观察的是调用返回并且文件操作未完成,则表明生成的操作由于某种原因而失败。

返回值表示什么?

答案 1 :(得分:0)

使用system()几乎肯定不是问题,但是你正在执行的操作。总是检查返回值,但更重要的是,您需要查看正在调用的命令的输出。对于非交互式使用,通常最好将stdout和stderr写入日志文件。一种方法是编写一个包装器脚本来检查底层命令,记录命令行,重定向stdout和stderr(如果你想小心,则关闭stdin),然后执行命令行。通过system()而不是OS命令直接运行它。

我敢打赌,失败的机器有足够的磁盘空间,或者缺少目标文件或实际的gzip / gunzip命令。

答案 2 :(得分:0)

  

我正在使用unix system()调用   gunzip和gzip文件。

可能很愚蠢的问题:为什么不直接从你的应用程序中使用zlib?

而system()不是系统调用。它是fork()/ exec()/ wait()的包装器。检查system()手册页。如果它没有解锁,可能是你的应用程序以某种方式干扰了wait() - 例如你有SIGCHLD处理程序吗?

答案 3 :(得分:0)

如果是Linux系统,我建议使用strace来查看发生了什么以及哪些系统调用阻塞。

您甚至可以将strace附加到已经运行的进程: # strace -p $PID

答案 4 :(得分:0)

听起来我正在遇到同样的间歇性问题,表示某种超时。我的脚本每天都在运行。我开始相信GZIP暂停了。

  1. gzip -vd filename.txt.gz 2>> tmp / errorcatch.txt 1>> logfile.log
  2. stderr:filename.txt.gz
  3. 出错
  4. 移至下一个命令&c; cp filename * new / directory /',在新目录中生成文件名的压缩版本
  5. 来自早期gzip的
  6. stdout显示成功解压缩SAME文件: filename.txt.gz:95.7% - 替换为filename.txt
  7. gzip中的成功输出文件不在源或新目录中。
  8. 关注提醒,手动运行' gzip -vd filename.txt.gz'永远不会失败。
  9. 详细说明:

    • 脚本中只有一个调用来解压缩该文件
    • 在函数内部调用解压缩(用于更多反叛记录和警报)
    • 无法生产
    • 无法在本地复制
    • 在上个月发生的情况下,发现文件大小没有一致性,只有

    我只是通过重试逻辑和一般脚本改进来解决它,但我希望下一个谷歌知道他们并不疯狂。这发生在其他人身上!