Проблема при выполнении системного вызова, системный вызов не отображается в ядре - PullRequest
0 голосов
/ 19 сентября 2019

В Ubuntu я написал новый системный вызов:

SYSCALL_DEFINE1(print_other, pid_t, targetpid)
{
    struct task_struct *p;

    int found = 0;

    for(p = &init_task; next_task(p) != &init_task; p=next_task(p))
    {
        if(p->pid == targetpid)
        {
            found = 1;
            break;
        }
    }

    if (found)
    {
            for(p = current; p != &init_task; p = p->parent)
            {
                    printk("Task:\n");
                    printk("Process ID: %d\n", p->pid);
                printk("Running state: %ld\n", p->state);
                    printk("Program name: %s\n", p->comm);
                printk("Start time: %llu\n", p->start_time);
                    printk("Virtual runtime: %llu\n\n", p->se.vruntime);
            }

    }

    else
    {
        printk("Your process was not found");
    }

    return 0;
}

Это мой файл тестирования:

#include <linux/unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define __NR_print_other 337

int main(int argc, char *argv[])
{
    char search[10];
    char *error;
    pid_t in_pid;
    unsigned long pid;

    while (true)
    {
        printf("Enter PID to search: ");
        scanf("%s", search);
        printf("passed scanf\n");
        pid = strtoul(search, &error, 10);
        printf("passed strtoul\n");

        if (*error || error == argv[1] || ((pid_t)pid != pid ||
                (pid_t)pid <= 0))
        {
            printf("in if statement\n");
            printf("\nError: Invalid PID entered\n");
            printf("Try again\n");
        }

        else
        {
            printf("in else statement\n");
            in_pid = pid;
            syscall(__NR_print_other, in_pid);
            printf("about to return, in_pid = %d\n", in_pid);

            return 0;
        }
    }
}

Но файл тестирования хорош.Системный вызов ничего не делает, и я не могу понять, почему.Что я должен делать, что я делаю неправильно?

Мне действительно нечего найти.Я проверил файл тестирования, и он работает правильно.Он возвращает верный in_pid и правильно выполняет проверку границ ошибок.В системном вызове должна быть логическая ошибка, но я не вижу, в чем проблема.

1 Ответ

0 голосов
/ 19 сентября 2019

Ваш системный вызов работает и что-то делает.Просто запустите dmesg и вы увидите нечто похожее на это:

[ 3755.306897] Task:
[ 3755.306898] Process ID: 1
[ 3755.306899] Running state: 1
[ 3755.306900] Program name: systemd
[ 3755.306902] Start time: 371331827
[ 3755.306903] Virtual runtime: 1757840935
...