android - 使用 execvp 子调用转储 logcat

标签 android c exec fork logcat

我想将 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/

相关文章:

javascript 在正则表达式执行后替换匹配项

c - execlp 的输出和管道出现问题

android - 有没有根据症状返回疾病类型的查询

java - 使用 PowerMockito 模拟并验证同一类中的 2 个方法 public static void 和 public static boolean

c# - List.IndexOf 在 ListView 中删除项目后返回 -1

c - GDB 在进入 C 函数时显示不正确的函数参数

c - 多线程密码破解器

c - 从文件读入C中的结构

python - exec() 在遇到 : character 时引发 'unexpected EOF' 错误

安卓初学者 :how to detect specific position on imageview in android