【问题标题】:Stop or killing thread in process with ptrace?使用 ptrace 停止或杀死进程中的线程?
【发布时间】:2019-04-02 11:40:20
【问题描述】:

从另一个进程中杀死一个进程中的特定线程。

下面是我的代码:

ptrace(PTRACE_ATTACH,threadID,NULL,NULL);

停止整个进程,但我只想停止一个特定线程。

能否请您提供一些关于如何进行的指示?

【问题讨论】:

  • 为什么不能使用“pthread_cancel”来杀死特定线程?
  • @AImx1 不带 ptrace 还是带 ptrace ?我想杀死不属于我的进程的线程
  • 你能详细说明“我想杀死不属于我的进程的线程”这句话吗?一个进程将至少有一个线程。线程仅在进程的上下文中有效。
  • @AImx1 我从process1 运行我的代码并想从process2 杀死/停止线程

标签: c linux pthreads kill ptrace


【解决方案1】:

您可以按照以下步骤操作:

1) 创建一个管道并初始化它。

2) 为特定信号创建信号处理程序,信号处理程序应执行最少的操作。在这种情况下,我会将“signum”写入管道的写入端。

3) 创建线程会在轮询时被阻塞,并且它需要从管道的读取端读取数据。

4) 然后我将忽略上面在其他线程中使用的信号。

5) 然后继续主线程,这里我有一个无限循环。

6) 现在您可以运行程序并使用进程 ID 从控制台发送信号。比如我们假设进程id是24566,那么我会发送信号如下:

kill -n 16 24566

这只会杀死特定的线程,而不是整个程序。

你可以在下面找到我写的程序:

#include <pthread.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/poll.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>

#define ERR -1

int                pipefd[2] = {0, 0};

void signal_handler(int signum)
{
    printf("signal handler");
    if (ERR == write(pipefd[1], &signum, sizeof(signum)))
        printf("errno: %d", errno);
}

void initializePipeAndAddSignalHandler()
{
    if (ERR == pipe(pipefd))
    {
        printf("pipe2 returned an error: %s", strerror(errno));
        exit(EXIT_FAILURE);
    }
    else
    {
        if (SIG_ERR == signal(SIGUSR1, signal_handler))
        {
            printf("Enabling signal Handling to SIGUSR1 failed: %s", strerror(errno));
            exit(EXIT_FAILURE);
        }
    }
}

void *threadfunc(void *arg)
{
    int sig = -1;
    const int NO_FDS = 1;
    struct pollfd fds[NO_FDS];
    nfds_t nfds = NO_FDS;

    const int PIPE_FD = 0;

    fds[PIPE_FD].events = POLLIN | POLLHUP;
    fds[PIPE_FD].fd = pipefd[0];

    printf("in threadfunc");
    while(1)
    {
        int ret = poll(fds, nfds, -1);
        printf("Poll called");
        if (ret != ERR)
        {
            if (POLLIN == (fds[PIPE_FD].revents & POLLIN))  
            {
                if (-1 != read(fds[PIPE_FD].fd, &sig, sizeof(sig)))
                {
                    switch (sig)
                    {
                        case SIGUSR1:
                        {
                            printf("received sigusr1");
                            return NULL;
                        }
                        default:
                        {
                            printf("UnKnown Signal received = %d", sig);
                            break;
                        }
                    }
                }
            }
        }
    }
}

int main()
{


    int sig_return;
    sigset_t set;

    initializePipeAndAddSignalHandler();

    pthread_t tid;
    if(pthread_create(&tid, NULL, &threadfunc, NULL)) 
    {
        fprintf(stderr, "Error creating thread\n");
        return 1;
   }


    sigemptyset(&set);
    sigaddset(&set, SIGUSR1);
    sig_return = pthread_sigmask(SIG_BLOCK, &set, NULL);
    if (sig_return != 0)
        printf("Setting sigmask failed");

    while (1)
    {
        printf("\nmain thread running\n");
        sleep (1);
    }

    printf("killed");
}

【讨论】:

  • 这比尝试使用ptrace(2) 侵入另一个进程要好得多。
  • @Almx1 ,我不明白你,1-你提议杀死必须从 pip 读/写的线程,或者我可以在没有任何条件的情况下杀死/停止我选择的任何线程? 2) kill -n 16 24566 向进程发送信号,我在哪里映射到我想要的线程?
  • @paramikoooo 我认为不可能选择无条件杀死的线程。您无法映射线程以从外部杀死,至少我不知道有任何接口支持此功能。
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多