【发布时间】:2021-06-12 11:32:48
【问题描述】:
假设我有以下名为 program.c 的程序
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int function(char **argv) {
pid_t pid = fork();
if (pid > 0) {
execv(*argv, argv);
}
int value=0;
return value;
}
int main(int argc, char **argv) {
int return2;
return2 = function(argv+1);
printf("%d\n", return2);
}
而我执行./program /bin/ls,为什么ls在return2的printf之后执行?
例如:./program /bin/ls
返回
0
file1
file2
file3
这与换行符(缓冲区相关)无关,因为即使我从 printf 中删除了 \n,行为也是相同的。
我希望 execv 在子进程有时间到达printf 之前立即打印ls。
【问题讨论】:
-
对于未来的问题,请花一些时间接受 SO tour、阅读 How to Ask 以及 this question checklist。您需要解释问题正文中的预期行为以及实际行为。我的回答其实只是对问题的猜测。
-
变量
result和value的作用是什么? -
result变量没用,value变量用于测试哪个最快,execv或printf。它只是表示要打印的值。 -
但是你并没有真正测量
execv调用本身的时间,你正在测量你的小 ans 快速程序与完整的ls程序,这将是相当慢的(通过数量级)。 -
OT: regaarding:
return2 = function(argv+1);在没有首先检查argc以确保用户实际输入命令行参数之前,不要访问argv[0]以外的地方。否则对argv[1]的访问将访问一个NULL值