我正在使用unix system()调用gunzip和gzip文件。对于有时非常大的文件(即在集群计算节点上),这些文件被中止,而其他时间(即在登录节点上)它们通过。系统调用可能需要一些软限制吗?还有什么呢?
答案 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暂停了。
详细说明:
我只是通过重试逻辑和一般脚本改进来解决它,但我希望下一个谷歌知道他们并不疯狂。这发生在其他人身上!