簡體   English   中英

使用execvp子調用轉儲logcat

[英]dumping logcat with execvp child call

我想將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尚未終止。 父級正在等待子級終止,但是在這種情況下,子級並未終止,但父級被阻止。

子級創建了文件/ data / logcat_dumped並將日志轉儲到該文件中,但子級沒有終止。 這里可能是什么錯誤? 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可以做到。

改變這個

const char *args[1024] = { "-d", "-f", "/data/logcat_dumped", NULL};

成為

const char * args[] = {command, "-d", "-f", "/data/logcat_dumped", NULL};

man 3 exec

按照慣例,第一個參數應指向與正在執行的文件關聯的文件名。


同樣也不需要將WUNTRACED傳遞給waitpid() 只是這樣稱呼它:

pid_t p = waitpid(pid, &status, 0);

添加錯誤檢查始終是一個好主意,因此請在調用waitpid()之后擴展邏輯,如下所示:

if (p == pid) {
...
}
else if ((pid_t) -1) = p)
{
  perror("waitpid() failed");
}

...

另外^ 2,在將args傳遞給execvp()時無需execvp()

應該這樣做:

execvp(command, args);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM