0

使用 pthreads,我创建了一个通过 shell 进行音频录制的线程:

void *thread_function(void *arg) {

system("arecord data.wav");

}

但是,当我调用pthread_cancel(&thread_ID);终止线程时,录音机仍然可以自己工作(当然,直到我终止整个 C 程序)。

如何停止执行系统调用的 pthread?提前致谢!

4

3 回答 3

2

您的线程启动函数应该执行以下操作:

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将杀死子进程。

于 2013-04-19T20:01:49.343 回答
1
system("arecord data.wav");

它将在您的系统中创建一个单独的进程(不是程序中的线程),并且终止该线程不会影响该进程。您应该通过另一个系统调用终止该进程。

但是,在非等待模式下使用spawn*函数制作过程比您的方式要好一些,在这种情况下,您不需要额外的线程。

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

但是,杀死创建的进程是丑陋的。

于 2013-04-19T19:23:28.697 回答
0

您可以使用pthread_kill将信号发送到特定线程。线程取消的问题是它会被延迟,直到程序到达取消点(见这个答案)。

如果您确实使用pthread_kill,那么您可以选择发送哪个信号。我认为应该可以用终止信号结束线程,然后终止由系统生成的子进程,尽管我对此不确定。

于 2013-04-19T19:29:25.223 回答