tgkill杀死整个过程,而不仅仅是tid传递

时间:2014-11-18 17:33:18

标签: c multithreading posix

我一直在尝试使用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的用法,或者我在这里调用某种错误?

1 个答案:

答案 0 :(得分:4)

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

  

信号处理是整个过程:如果安装了信号处理程序,将在线程线程中调用处理程序,但如果信号的处置是&#34;停止&#34;,&#34;继续&# 34;或者&#34;终止&#34;,这个动作将影响整个过程。

&#34;终止&#34;信号被传递到指定的线程,但效果是杀死整个过程。