Linux - Syscall迭代儿童线程

时间:2014-10-30 05:59:01

标签: linux pthreads kernel system-calls child-process

我正在创建一个系统调用来返回有关进程及其子线程的一些信息。我在Ubuntu 14.04中测试它。这是我写的代码:

#include <linux/list.h>
#include <linux/linkage.h>
#include <linux/sched.h>
#include <linux/uaccess.h>

#define NUM_THREADS 5

struct thread_info_prj {
    int pid;
    int nthreads;
    int tid[NUM_THREADS];
};

asmlinkage void sys_threadinfo_prj(void *ptr)
{
    struct task_struct *task;
    struct thread_info_prj t_info;
    struct list_head *list;
    int num_threads = 0;

    t_info.pid = current->pid;

    list_for_each(list, &current->children) {
        //task = list_entry(&p_task->children, struct task_struct, sibling);
        task = list_entry(list, struct task_struct, sibling);
        t_info.tid[num_threads] = task->pid;
        num_threads++;
    }

    t_info.nthreads = num_threads;

    copy_to_user(ptr, &t_info, sizeof(struct thread_info_prj));
}

此代码作为系统调用内置在内核中,并使用以下程序进行测试。

#include <pthread.h>
#include <stdio.h>
#include <sys/syscall.h>
#include <errno.h>

#define NUM_THREADS 5

struct thread_info_prj {
    int pid;
    int nthreads;
    int tid[NUM_THREADS];
};

void * thread_fn(void *ptr) {
    printf("Im a thread!\n");
    sleep(4);
    pthread_exit(NULL);
}

int main() {
    pthread_t threads[NUM_THREADS];
    pthread_attr_t attr;
    int i;
    struct thread_info_prj t_info;
    void *status;

    pthread_attr_init(&attr);
    //pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
    for (i = 0; i < NUM_THREADS; i++)
        pthread_create(&(threads[i]), &attr, thread_fn, NULL);

    sleep(1);

    syscall(352, &t_info);

    //for (i = 0; i < NUM_THREADS; i++)
    //  pthread_join(threads[i], &status);
    printf("PID: %d\n", t_info.pid);
    printf("Num Threads: %d\n", t_info.nthreads);

    for (i = 0; i < t_info.nthreads; i++) {
        printf("Thread ID: %d\n", t_info.tid[i]);
    }

    printf("%s\n",strerror(errno));

    return 0;
}

不幸的是,唯一的输出是正确的父pid。否则,它返回没有线程并且不打印任何其他PID。通过在for循环中添加一个printk,我发现它甚至从未进入for循环。有什么建议吗?

非常感谢。

0 个答案:

没有答案
相关问题