Операционная система, эксперимент 6 с общей памятью

1. Комбинированная команда поиска и grep для глубокого обучения: (1) Создайте файл file.txt в каталоге /tmp. и записывает в файл строку «Я люблю ОС». Используйте комбинированную команду find, чтобы найти все обычные файлы в каталоге /tmp. (2) Найдите имя файла со строкой «os» в файле в каталоге /tmp. (Совет по использованию find в сочетании с grep)

2. Напишите программу, которая использует системные вызовы shmget(), shmat(), shmdt(), shmctl() для реализации взаимодействия процессов через общую память: подпроцесс SERVER устанавливает первый байт общей памяти в -1, когда первое слово Если значение раздела не -1, прочитайте это значение и снова установите его на -1; другой дочерний процесс CLIENT устанавливает первый байт в число 9-0, когда первый байт равен -1. (Значение SHMKEY равно 75, а длина общей области — 1024).

Используйте комбинационную команду find для поиска обычных файлов:

find /tmp -type f

Эта команда будет искать все обычные файлы в каталоге /tmp.

Используйте комбинацию команд find и grep, чтобы найти имена файлов, содержащие строку «os»:

find /tmp -type f -exec grep -l "os" {} \;

Эта команда выполнит поиск всех файлов, содержащих строку «os», в каталоге /tmp и вернет имена этих файлов.

Программа межпроцессного взаимодействия с общей памятью:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>

#define SHM_KEY 75
#define SHM_SIZE 1024

int main() {
    int shmid = shmget(SHM_KEY, SHM_SIZE, IPC_CREAT | 0666);
    if (shmid < 0) {
        perror("shmget");
        exit(1);
    }

    char *shmaddr = shmat(shmid, NULL, 0);
    if (shmaddr == (char *) -1) {
        perror("shmat");
        exit(1);
    }

    pid_t pid = fork();
    if (pid < 0) {
        perror("fork");
        exit(1);
    } else if (pid == 0) {
        // 子进程SERVER
        *shmaddr = -1; // 将共享内存首字节置为-1
        printf("SERVER: set shared memory value to %d\n", *shmaddr);
        while (*shmaddr == -1); // 等待首字节值不为-1
        printf("SERVER: get shared memory value %d\n", *shmaddr);
        *shmaddr = -1; // 再次将共享内存首字节置为-1
        printf("SERVER: set shared memory value to %d\n", *shmaddr);
    } else {
        // 子进程CLIENT
        while (*shmaddr == -1); // 等待首字节值不为-1
        printf("CLIENT: get shared memory value %d\n", *shmaddr);
        *shmaddr = rand() % 10; // 将首字节置为9-0中的一个数字
        printf("CLIENT: set shared memory value to %d\n", *shmaddr);
    }

    shmdt(shmaddr);
    shmctl(shmid, IPC_RMID, NULL);
    return 0;
}

Программа использует функцию shmget() для создания разделяемой памяти, а затем использует shmat() для присоединения разделяемой памяти к адресному пространству процесса. Подпроцесс SERVER устанавливает первый байт разделяемой памяти на -1 и ждет, пока значение первого байта не будет -1, а затем устанавливает первый байт в -1; дочерний процесс CLIENT ждет, пока значение первого байта не будет равно -1, считывает значение и устанавливает первый байт в число из 9-0. Наконец, используйте shmdt(), чтобы отделить общую память от адресного пространства процесса, и используйте shmctl(), чтобы удалить общую память.

おすすめ

転載: blog.csdn.net/weixin_53154312/article/details/129879922
6-2