操作系统实验六共享内存

1.深度学习find和grep组合命令:(1)在/tmp目录下建立文件file.txt。并写入字符串“I love os”到文件中。使用find组合命令,查找/tmp目录下的所有普通文件。(2)查找/tmp目录下文件中有“os”字符串的文件名称。(提示采用find与grep组合使用)

2.编写一个程序,使用系统调用shmget(), shmat(), shmdt(), shmctl()实现进程通过共享内存的通信:一个子进程SERVER将共享内存首字节置为-1,当首字节值不为-1时读取这个值并再次将其置为-1;另一个子进程CLIENT在首字节为-1时将首字节置为9-0中的一个数字。(SHMKEY取值75,共享区的长度取1024)。

使用find组合命令查找普通文件:

find /tmp -type f

该命令会在/tmp目录下查找所有的普通文件。

使用find与grep组合命令查找含有“os”字符串的文件名称:

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

该命令会在/tmp目录下查找所有含有“os”字符串的文件,并返回这些文件的名称。

进程间共享内存通信程序:

#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