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(), чтобы удалить общую память.