来看这个代码
#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.