[英]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.