C 终止在shell中激活进程的线程

C 终止在shell中激活进程的线程,c,shell,pthreads,C,Shell,Pthreads,使用pthreads,我创建了一个通过shell进行音频录制的线程: void *thread_function(void *arg) { system("arecord data.wav"); } 但是,当我调用pthread\u cancel(&thread\u ID)时要终止线程,录音机仍然可以自己工作(当然,在我终止整个C程序之前) 如何停止执行系统调用的pthread?提前谢谢 system("arecord data.wav"); 它将在系统中创建一个单独的进程(而不是程序中

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

void *thread_function(void *arg) {

system("arecord data.wav");

}
但是,当我调用
pthread\u cancel(&thread\u ID)时
要终止线程,录音机仍然可以自己工作(当然,在我终止整个C程序之前)

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

system("arecord data.wav");
它将在系统中创建一个单独的进程(而不是程序中的线程),终止该线程不会影响该进程。您应该通过另一个系统调用终止该进程

但是,使进程的函数处于非等待模式比您的方式要好一点,在这种情况下,您不需要额外的线程

spawnl(P_NOWAIT, "arecord data.wav", .... );
但是,扼杀创造的过程是丑陋的

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

但是,使进程的函数处于非等待模式比您的方式要好一点,在这种情况下,您不需要额外的线程

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

但是,终止创建的进程是很难看的。

您可以使用
pthread\u kill
向特定线程发送信号。线程取消的问题是,它将被延迟,直到程序到达取消点()


如果确实使用了
pthread\u kill
,则可以选择发送哪个信号。我认为应该可以使用kill信号结束线程,然后也可以结束系统生成的子进程,尽管我不确定这一点。

您可以使用
pthread\u kill
向特定线程发送信号。线程取消的问题是,它将被延迟,直到程序到达取消点()


如果确实使用了
pthread\u kill
,则可以选择发送哪个信号。我认为应该可以使用kill信号结束线程,这也会结束系统生成的子进程,尽管我不确定这一点。

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

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);
pid\u t pid;
智力状态;
posix_spawnp(&pid,“arecord”,0,0,(char*[]){“arecord”,“data.wav”,0},environ);
pthread_cleanup_push(清除和pid);

while(waitpid(pid,&status,0)线程启动函数应执行以下操作:

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);
pid\u t pid;
智力状态;
posix_spawnp(&pid,“arecord”,0,0,(char*[]){“arecord”,“data.wav”,0},environ);
pthread_cleanup_push(清除和pid);

while(waitpid(pid,&status,0)似乎是合乎逻辑的。因此我将不得不创建一个
系统(“killall arecord”)
?Ubuntu12.04。不管怎样,刚刚测试了
killall
方法,它对我很有效。看来我根本不需要使用pthreads。非常感谢你的帮助!假警报:起初我尝试了
killall
方法,使用线程机制。如果没有它,程序会被困在系统调用中。所以本质上,线程仍然是necessary。这个答案不是很好的建议。从新线程调用
system
的意义在于,当
system
阻塞时,您的程序可以继续运行。但是,
system
有许多潜在的线程安全问题,这使得它的使用是一个非常糟糕的主意。使用
fork
exec
或者更好的
posix_spawn
会更好。如果你想要一个pthread样式的接口,你可以将它包装在一个调用
posix_spawn
的线程中,然后立即调用
waitpid
,这个线程可以有一个取消函数来终止子进程,这样就可以对它使用
pthread_cancel
。@MM.:那更糟了。然后你呢没有子进程的pid,因此无法确定它何时完成或提前终止。似乎是合乎逻辑的。因此,我将不得不创建一个
系统(“killall arecord”)
?Ubuntu12.04。不管怎样,刚刚测试了
killall
方法,它对我很有效。看来我根本不需要使用pthreads。非常感谢你的帮助!假警报:起初我尝试了
killall
方法,使用线程机制。如果没有它,程序会被困在系统调用中。所以本质上,线程仍然是necessary。这个答案不是很好的建议。从新线程调用
system
的意义在于,当
system
阻塞时,您的程序可以继续运行。但是,
system
有许多潜在的线程安全问题,这使得它的使用是一个非常糟糕的主意。使用
fork
exec
或者更好的
posix_spawn
会更好。如果你想要一个pthread样式的接口,你可以将它包装在一个调用
posix_spawn
的线程中,然后立即调用
waitpid
,这个线程可以有一个取消函数来终止子进程,这样就可以对它使用
pthread_cancel
。@MM.:那更糟了。然后你呢没有子进程的pid,因此无法确定它何时完成或提前终止。不,它没有起作用。我想这是M.说的。无论如何,谢谢你的帮助!
:)
不,它没有起作用。我想这是M.说的。无论如何,谢谢你的帮助!