我想将 logcat 转储到某个文件,所以在 shell 中如果我这样做了
logcat -d -f /data/logcat_dumped
上面的命令会将 logcat 转储到文件并退出,所以我想通过 C 编程实现同样的效果。下面是代码
const char command[] = "logcat";
pid_t pid = fork();
/* handle error case */
if (pid < 0) {
printf("*** fork: %s\n", strerror(errno));
return pid;
}
/* handle child case */
if (pid == 0) {
const char *args[1024] = { "-d", "-f", "/data/logcat_dumped", NULL};
printf("start of exec\n");
execvp(command, (char**) args);
printf("*** exec(%s): %s\n", command, strerror(errno));
fflush(stdout);
_exit(-1);
}
else
{
int status;
printf("wat for pid %d\n", pid);
pid_t p = waitpid(pid, &status, WUNTRACED);
printf("pid %d ret %d\n", pid, p);
if (p == pid) {
if (WIFSIGNALED(status)) {
printf("*** %s: Killed by signal %d\n", command, WTERMSIG(status));
} else if (WIFEXITED(status) && WEXITSTATUS(status) > 0) {
printf("*** %s: Exit code %d\n", command, WEXITSTATUS(status));
}
return status;
}
}
这里execvp还没有全部终止。 parent 正在等待 child 终止,但在这种情况下, child 不是 终止但所有父级被阻止。
child 创建了文件/data/logcat_dumped 并将日志转储到它,但 child 没有终止。这里可能是什么错误? logcat 本身没有终止?? 有逻辑错误吗??
上面程序的输出是
wat for pid 1581
start of exec
最佳答案
不确定这是否是所有错误的,但像这样:
const char *args[1024] = { "-d", "-f", "/data/logcat_dumped", NULL};
printf("start of exec\n");
execvp(command, (char**) args);
您告诉 logcat
它的进程名称是 -d
并且它的第一个参数是 -f
。另外,为什么需要 1024(!) 个指针数组?在这种情况下,当您正确地将进程名称作为第一个条目传递时(argv[0]
... 按照惯例与正在执行的命令相同),5 会执行此操作。
关于android - 使用 execvp 子调用转储 logcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31581129/