【发布时间】:2021-02-18 21:19:50
【问题描述】:
我把这个程序写成更精确的 GNU 时间版本。 这个想法是你用你的程序和可选的一些参数来调用它。程序部分正在运行,但参数未正确传递。
> gcc -o time time.c
> ./time sleep 3
exits right away instead of waiting 3 seconds, sleep is called but doesn't seem to see the args.
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("./time PROGRAM arg1 arg2 ...\n");
exit(-1);
}
struct rusage result;
pid_t cpid;
int id = fork();
if (id == 0) {
fclose(stdout);
fclose(stderr);
execv(argv[1], argv + 1);
} else {
cpid = wait(NULL);
}
getrusage(RUSAGE_CHILDREN, &result);
unsigned long micro_seconds = result.ru_utime.tv_usec + result.ru_stime.tv_usec;
micro_seconds += (result.ru_utime.tv_sec + result.ru_stime.tv_sec) * 1000000;
printf("%lu\n", micro_seconds);
exit(0);
}
【问题讨论】:
-
程序部分正在运行..sleep 被调用。你确定吗?你怎么知道
execv不只是失败,因为它看起来与sleep立即返回相同?execv需要第一个 arg 是完整路径,它不在您的示例运行中。所以我猜execv实际上失败了。建议您为execv调用添加错误检查。 -
我同意 kaylum 如果您需要错误代码,您可以阅读linux.die.net/man/2/execve
-
@kaylum 已删除,谢谢!