簡體   English   中英

終止在外殼中激活進程的線程

[英]Terminate a thread that activates a process in the shell

使用pthreads,我創建了一個通過shell進行音頻錄制的線程:

void *thread_function(void *arg) {

system("arecord data.wav");

}

但是,當我調用pthread_cancel(&thread_ID); 要終止線程,錄音機仍然可以單獨工作(直到我終止整個C程序)。

如何停止系統調用的pthread? 提前致謝!

您的線程啟動函數應執行以下操作:

pid_t pid;
int status;
posix_spawnp(&pid, "arecord", 0, 0, (char *[]){"arecord", "data.wav", 0}, environ);
pthread_cleanup_push(cleanup, &pid);
while (waitpid(pid, &status, 0)<0 && errno==EINTR);
pthread_cleanup_pop(0);

具有如下清除功能:

static void cleanup(void *p)
{
    pid_t pid = *(pid_t *)p;
    kill(pid, SIGTERM);
    while (waitpid(pid, &status, 0)<0 && errno==EINTR);
}

然后用pthread_cancel取消線程將殺死子進程。

system("arecord data.wav");

它將在系統中創建一個單獨的進程(不是程序中的線程),並且終止該線程不會影響該進程。 您應該通過另一個系統調用終止該進程。

但是,在非等待模式下使用spawn *函數進行處理比您的方式要好一些,在這種情況下,您不需要額外的線程。

spawnl(P_NOWAIT, "arecord data.wav", .... );

但是,殺死創建的進程很丑陋。

您可以使用pthread_kill將信號發送到特定線程。 線程取消的問題在於,它將被延遲到程序到達取消點為止( 請參閱此答案 )。

如果確實使用pthread_kill則可以選擇發送哪個信號。 我認為應該有一個終止信號終止線程,然后終止一個由系統生成的子進程,盡管我不確定。

暫無
暫無

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

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