今天开始学习国嵌第三季下学期的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",不过这也确实是程序效果。