【学习笔记】天嵌2440第三季下学期——linux共享内存通讯

今天开始学习国嵌第三季下学期的linux编程,官方没有提供源代码,首先我把源代码奉上:

write.c:

#include <sys/types.h>

#include <sys/shm.h>

#include <sys/ipc.h>

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>



#define TEXT_SZ 2048



struct shared_use_st

{

	int wrtitten_by_you;

	char some_text[TEXT_SZ];

};



int main()

{

	int running = 1;

	int shmid;

	struct shared_use_st *shared_stuff;

	char buffer[TEXT_SZ];



	//1、创建共享内存

	shmid = shmget((key_t)1234, sizeof(struct shared_use_st), IPC_CREAT);

	if (shmid == -1)

	{

		printf("error\n");

		exit(EXIT_FAILURE);

	}



	//2、映射共享内存,强制转化为(struct shared_use_st *)类型

	shared_stuff = (struct shared_use_st *)shmat(shmid, NULL, 0);



	//3、循环操作

	while (running)

	{

		while (shared_stuff->wrtitten_by_you == 1)

		{

			sleep(1);

			printf("wait by you\n");

		}



		//3.1获取用户输入

		fgets(buffer, TEXT_SZ, stdin);



		//3.2将用户输入的字符串放进共享内存

		strncpy(shared_stuff->some_text, buffer, TEXT_SZ);

		shared_stuff->wrtitten_by_you = 1;



		if (strncmp(buffer, "end", 3) == 0)

			running = 0;

	}



	//4、脱离共享内存

	shmdt((const void *)shared_stuff);



	return 1;

}
read.c:

#include <sys/types.h>

#include <sys/shm.h>

#include <sys/ipc.h>

#include <stdio.h>

#include <unistd.h>

#include <stdlib.h>



#define TEXT_SZ 2048



struct shared_use_st

{

	int wrtitten_by_you;

	char some_text[TEXT_SZ];

};



int main()

{

	int shmid;

	struct shared_use_st *shared_stuff;

	int running = 1;



	//1、创建共享内存

	shmid = shmget((key_t)1234, sizeof(struct shared_use_st), IPC_CREAT);





	//2、映射共享内存,强制转化为(struct shared_use_st *)类型

	shared_stuff = (struct shared_use_st *)shmat(shmid, NULL, 0);



	shared_stuff->wrtitten_by_you = 0;

	//3、循环操作

	while (running)

	{

		//打印共享内存

		if (shared_stuff->wrtitten_by_you == 1)

		{

			printf("write process is:%s\n", shared_stuff->some_text);

			shared_stuff->wrtitten_by_you = 0;

		}



		if (strncmp(shared_stuff->some_text, "end", 3) == 0)

			running = 0;

	}



	//4、脱离共享内存

	shmdt((const void *)shared_stuff);



	//5、删除共享内存

	shmctl(shmid, IPC_RMID, 0);



	return 1;

}


虽然说有视频对照着来打代码,但出现的问题仍然相当多:

1、首先是核心段错误。

在完成编译之后运行会产生核心段错误。

首先,我对转存的段错误查看了一下,却没有发现什么问题,只好启动gdb调适,发现每当访问共享内存的时候就会产生段错误。

shared_stuff->wrtitten_by_you
会导致程序崩溃。

在某度上搜了好一会,终于发现这篇博客:

http://blog.chinaunix.net/uid-121788-id-2955063.html
据介绍,对共享内存访问必须要超级权限(我是ubuntu16.04)。果然sudo su之后就能够运行程序,不过能够运行是一回事,成功运行又是另一回事。

2、没有任何输入write、read终端都在不断打印。

我仔细对比了一下代码,终于发现问题:read.c里面:

//打印共享内存

		if (shared_stuff->wrtitten_by_you == 1)

		{

			printf("write process is:%s\n", shared_stuff->some_text);

			shared_stuff->wrtitten_by_you = 1;

		}

shared_stuff->wrtitten_by_you = 1;
就是这句的锅,如果读完共享内存之后标志位仍然是1,那下次还会是read的动作,必须要置零(上面的代码已经修改好)。

运行了一下,大概实现功能,只不过有点小瑕疵:write一开始运行仍会不断地打印"wait by you\n",不过这也确实是程序效果。

原创文章 26 获赞 9 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34917736/article/details/75947890