使用pthreads,我创建了一个通过shell进行音频录制的线程:
void *thread_function(void *arg) {
system("arecord data.wav");
}
但是,当我调用pthread_cancel(&thread_ID);
来终止线程时,录音机仍然可以自行工作(当然我终止整个C程序)。
如何停止进行系统调用的pthread?提前谢谢!
答案 0 :(得分: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
取消线程将终止子进程。
答案 1 :(得分:1)
system("arecord data.wav");
它将在您的系统中创建一个单独的进程(不是程序中的一个线程),并且终止该线程不会影响该进程。你应该通过另一个系统调用来杀死那个进程。
然而,在非等待模式下使用spawn*函数进行处理比您的方式好一些,在这种情况下,您不需要额外的线程。
spawnl(P_NOWAIT, "arecord data.wav", .... );
但是,杀死创建的进程很难看。
答案 2 :(得分:0)
您可以使用pthread_kill
向特定线程发送信号。线程取消的问题是它会被延迟,直到程序到达取消点(see this answer)。
如果您使用pthread_kill
,则可以选择要发送的信号。我认为应该可以用一个kill信号结束线程,这也会结束系统产生的子进程,虽然我不确定。