Формирование массива системных вызовов процесса и их подсчет

Есть файл с таким содержимым:

Имя процесса: env
  - Идентификатор процесса: 7140
    - Системный вызов: execve, Количество вызовов: 12
    - Системный вызов: brk, Количество вызовов: 6
    - Системный вызов: access, Количество вызовов: 6
    - Системный вызов: openat, Количество вызовов: 4
    - Системный вызов: fstat, Количество вызовов: 4
    - Системный вызов: mmap, Количество вызовов: 10
    - Системный вызов: close, Количество вызовов: 4
    - Системный вызов: mprotect, Количество вызовов: 8
    - Системный вызов: arch_prctl, Количество вызовов: 2
    - Системный вызов: munmap, Количество вызовов: 2
Имя процесса: run-parts
  - Идентификатор процесса: 7140
    - Системный вызов: wait4, Количество вызовов: 1
    - Системный вызов: stat, Количество вызовов: 2
    - Системный вызов: access, Количество вызовов: 2
    - Системный вызов: clone, Количество вызовов: 2
Имя процесса: xautolock
  - Идентификатор процесса: 6721
    - Системный вызов: poll, Количество вызовов: 1
    - Системный вызов: recvmsg, Количество вызовов: 6
    - Системный вызов: nanosleep, Количество вызовов: 1

Программа читает этот файл построчно и формирует массив для каждого процесса следующим образом:

[Идентификатор системного вызова, количество раз которые он выполнился в рамках процесс, Идентификатор системного вызова, количество раз которые он выполнился в рамках процесса ]

Пример

[1, 23, 2, 23 ]

Идентификатором процесса является индекс системного вызова из файл syscalss.txt

Файл syscalss.txt
open
close
read
write
socket
bind
connect
listen
send
sendto
recv
recvfrom
shutdown
getsockname
getpeername
socketpair
setsockopt
getsockopt
sendmsg

Код python

def process_file(file_path, syscalls_file):
    """
    Читает файл с данными о процессах и файл с системными вызовами, 
    формирует гистограммы для каждого процесса и возвращает список 
    с количеством вызовов для каждого системного вызова.

    Args:
        file_path: Путь к файлу с данными о процессах.
        syscalls_file: Путь к файлу с системными вызовами.

    Returns:
        Список с количеством вызовов для каждого системного вызова (индекс элемента 
        - номер системного вызова в файле syscalls.txt).
    """

    process_data = {}
    syscall_counts = []
    syscalls_dict = {}
    syscall_index = 0

    # Загружаем список системных вызовов из файла syscalls.txt
    with open(syscalls_file, 'r') as f:
        for line in f:
            syscall_name = line.strip()
            # Удаляем пробелы из имен системных вызовов
            syscall_name = syscall_name.replace(" ", "")
            syscalls_dict[syscall_name] = syscall_index
            syscall_index += 1

    # Создаем список нулей для подсчета системных вызовов
    syscall_counts = [0] * len(syscalls_dict)

    with open(file_path, 'r') as f:
        current_process_id = None
        for line in f:
            line = line.strip()
            if line.startswith("Имя процесса:"):
                # Извлекаем имя и ID процесса
                process_name = line.split(":")[1].strip()
                process_id = int(f.readline().split(":")[1].strip())
                current_process_id = process_id
                process_data[process_id] = {}

            elif line.startswith("  - Системный вызов:"):
                # Извлекаем имя системного вызова и количество вызовов
                syscall_name = line.split(":")[1].split(",")[0].strip()
                # Удаляем пробелы из имен системных вызовов
                syscall_name = syscall_name.replace(" ", "")
                syscall_count = int(line.split(":")[1].split(",")[1].split()[1])
                process_data[current_process_id][syscall_name] = syscall_count

    # Формируем список с количеством вызовов для каждого системного вызова
    for process_id, syscall_data in process_data.items():
        for syscall_name, syscall_count in syscall_data.items():
            syscall_index = syscalls_dict.get(syscall_name, None)
            if syscall_index is not None:
                syscall_counts[syscall_index] += syscall_count

    return syscall_counts

# Пример использования
file_path = "output.txt"  # Замените на путь к вашему файлу
syscalls_file = "syscalls.txt"  # Замените на путь к файлу syscalls.txt
syscall_counts = process_file(file_path, syscalls_file)

# Вывод результатов
print(syscall_counts)

Подскажите, не совсем пониманию почему выводятся нули?


Ответы (0 шт):