我一直在尝试使用tgkill
远程杀死线程。我知道
pthread_kill
被推荐用于此类事情,因为没有任何glibc
tgkill
的包装器但是,我将在该过程之外进行kill调用。
我在这里做了一个小例子来说明发生了什么。
#define _GNU_SOURCE
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/syscall.h>
#define GETTID 224
void helper1(void);
void helper2(void);
int main(int argc, char *argv[])
{
pid_t process_id, thread_id;
pthread_t h1, h2;
process_id = getpid();
thread_id = syscall(GETTID);
printf("Main Thread: (PID-> %d :: TID-> %d\n", process_id, thread_id);
pthread_create(&h1, NULL, (void *) helper1, NULL);
sleep(1); // slight delay in creating each thread.
pthread_create(&h2, NULL, (void *) helper2, NULL);
printf("Entering Main's loop\n");
for (;;)
;
return 0;
}
void helper1(void)
{
pid_t process_id, thread_id;
process_id = getpid();
thread_id = syscall(GETTID);
printf("Helper1 Thread: (PID-> %d :: TID-> %d\n", process_id, thread_id);
sleep(3);
printf("Entering Helper1's loop\n");
for (;;)
;
}
void helper2(void)
{
pid_t process_id, thread_id;
process_id = getpid();
thread_id = syscall(GETTID);
printf("Helper2 Thread: (PID-> %d :: TID-> %d\n", process_id, thread_id);
sleep(3);
printf("Entering Helper2's loop\n");
for (;;)
;
}
在获取并传递tgid和其中一个线程ID之后编译以下内容 打印出来。
#define _GNU_SOURCE
#include <stdio.h>
#include <ctype.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/syscall.h>
#define TGKILL 270
int main(int argc, char *argv[])
{
long ret;
int tgid, tid;
tgid = atoi(argv[1]);
tid = atoi(argv[2]);
ret = syscall(TGKILL, tgid, tid, SIGTERM);
if (ret != 0)
perror("tgkill");
return 0;
}
调用上面传递的tgid和tid结束,整个进程被终止,而不是仅仅结束tid的预期结果,主进程继续循环。
这是正确的结果吗?我只是不理解tgkill
的用法,或者我在这里调用某种错误?
答案 0 :(得分:4)
来自man pthread_kill
(基本上是围绕tgkill
系统调用的pthreads包装器):
信号处理是整个过程:如果安装了信号处理程序,将在线程线程中调用处理程序,但如果信号的处置是&#34;停止&#34;,&#34;继续&# 34;或者&#34;终止&#34;,这个动作将影响整个过程。
&#34;终止&#34;信号被传递到指定的线程,但效果是杀死整个过程。