进程通信-共享内存机制
1.实验目的
① 了解和掌握linux操作系统的基本操作
② 了解并掌握进程通信中共享内存机制的工作原理
2.实验平台
操作系统:Linux
3.实验内容和要求
(一)操作实验任务
① 深度学习find和grep组合命令
② 在/tmp目录下建立文件file.txt。并写入字符串“I love os”到文件中。使用find组合命令,查找/tmp目录下的所有普通文件。
③ 查找/tmp目录下文件中有“os”字符串的文件名称。(提示采用find与grep组合使用)
(二)编程实验任务
① 编写一个程序,使用系统调用shmget(), shmat(), shmdt(), shmctl()实现进程通过共享内存的通信:一个子进程SERVER将共享内存首字节置为-1,当首字节值不为-1时读取这个值并再次将其置为-1;另一个子进程CLIENT在首字节为-1时将首字节置为9-0中的一个数字。(SHMKEY取值75,共享区的长度取1024)
实验内容如下
① 深度学习find和grep组合命令
grep的常用选项参数
常用选项参数 “-v” 反向筛选出不含指定关键字的行
常用选项参数 “-I” 将以忽略大小写的方式来筛选
- 查找file.txt中含os字母的行,os无论大小写都能匹配并输出
grep -i os file.txt
- 查找file.txt中含os小写字母的行,并输出
grep os file.txt
- 查找file.txt中含OS大写字母的行,并输出
grep OS file.txt
- 查找file.txt中不含os小写字母的行,并输出
grep -v os file.txt
- 查找file.txt中不含OS大写字母的行,并输出
grep -v OS file.txt
find和grep的组合命令
- 在当前目录下所有文件中查找内容包含 string 的文件:
find ./ -name "*" -exec grep "string" {} \;
- 在当前目录下所有文件中查找内容包含 string 的文件并列出字符所在的文件:
find ./ -name "*" -exec grep -l "string" {} \;
- 在当前目录下 *.c 中查找内容包含 string 的文件并列出字符所在的文件的所在行(不显示文件名):
find ./ -name "*.c" -exec grep -n "string" {} \;
- 在当前目录下所有文件中查找内容包含 string 的文件并列出字符所在的文件,所在行及所在行的内容:
find ./ -name "*" -exec grep -n "string" ./ {} \;
② 在/tmp目录下建立文件file.txt。并写入字符串“I love os”到文件中。使用find组合命令,查找/tmp目录下的所有普通文件。
- 建立文件file.txt
touch /tmp/file.txt
- 通过命令行写入I love os到文件中
echo "I LOVE OS">>file.txt
- 查找/tmp目录下的所有普通文件
find . -type f
③ 查找/tmp目录下文件中有“os”字符串的文件名称。(提示采用find与grep组合使用)
find ./ -name “*.txt” -exec grep -l “os” {} \ ;
编写一个程序,使用系统调用shmget(), shmat(), shmdt(), shmctl()实现进程通过共享内存的通信:一个子进程SERVER将共享内存首字节置为-1,当首字节值不为-1时读取这个值并再次将其置为-1;另一个子进程CLIENT在首字节为-1时将首字节置为9-0中的一个数字。(SHMKEY取值75,共享区的长度取1024)
代码如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/shm.h>
#define SHMKEY 75
int shmid,i;
int * addr;
int CLIENT()
{
int i;
shmid=shmget(SHMKEY,1024,0777);
addr=(int *)shmat(shmid,0,0);
for(i=9;i>=0;i--)
{
while(*addr!=-1);
printf("(client)sent\n");
*addr=i;
}
exit(0);
}
int SERVER()
{
shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);
addr=(int *)shmat(shmid,0,0);
do
{
*addr=-1;
while(*addr==-1);
printf("(server)received\n");
}while(*addr);
shmctl(shmid,IPC_RMID,0);
exit(0);
}
int main()
{
while((i=fork())==-1);
if(!i)
SERVER();
while((i=fork())==-1);
if(!i)
CLIENT();
wait(0);
wait(0);
return 0;
}