Linux 调用 system 函数的注意事项

来看这个代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    system("sleep 5 && touch test.txt");
    FILE *fp = fopen("test.txt", "r");
    if (!fp) {
        printf("%m\n");
        return -1;
    }
    fclose(fp);
    return 0;
}

问题来了,不上机,凭理解,这个代码会有怎样的行为?

这个其实涉及到对 system 实现的理解,是 fork 完了继续跑后面代码,还是会阻塞直到命令返回,反应到这个例子上,就是瞬间跑完,报 no such file 呢,还是卡 5 秒钟,正常退出?

答案是卡 5 秒钟。原因看这里,http://my.oschina.net/renhc/blog/53580

为了更好的理解system()函数返回值,需要了解其执行过程,实际上system()函数执行了三步操作:
1.fork一个子进程;
2.在子进程中调用exec函数去执行command;
3.在父进程中调用wait去等待子进程结束。
对于fork失败,system()函数返回-1。
如果exec执行成功,也即command顺利执行完毕,则返回command通过exit或return返回的值。
(注意,command顺利执行不代表执行成功,比如command:”rm debuglog.txt”,不管文件存不存在该command都顺利执行了)
如果exec执行失败,也即command没有顺利执行,比如被信号中断,或者command命令根本不存在,system()函数返回127.
如果command为NULL,则system()函数返回非0值,一般为1.

Leave a Reply

Your email address will not be published. Required fields are marked *