gpt4 book ai didi

c - tgkill 杀死整个进程,而不仅仅是通过的 tid

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:57 26 4
gpt4 key购买 nike

我一直在尝试使用 tgkill 远程终止一个线程。我知道pthread_kill 被推荐用于这种事情,因为没有任何 glibctgkill 的包装器,但是,我将在进程之外进行 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 的用法,还是我在这里调用时犯了某种错误?

最佳答案

来自 man pthread_kill(本质上是 tgkill 系统调用的 pthreads 包装器):

Signal dispositions are process-wide: if a signal handler is installed, the handler will be invoked in the thread thread, but if the disposition of the signal is "stop", "continue", or "terminate", this action will affect the whole process.

“终止”信号传递给指定的线程,但效果是杀死整个进程。

关于c - tgkill 杀死整个进程,而不仅仅是通过的 tid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27000414/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com