进程通信-共享内存机制(实验6)

进程通信-共享内存机制

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;
}

猜你喜欢

转载自blog.csdn.net/YZ_TONGXIE/article/details/106739908
今日推荐