我编写了一个C程序来显示led留言板上的文字。
我循环遍历包含我的消息的char *,经过几次处理后,我给出了段错误。
我在此代码中已经隔离了我的问题(段错误出现在scrollMsg()函数中):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
void setMsg()
{
key_t key;
int shmid;
char *data;
key = ftok("my_test_key", 'R');
shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT);
data = shmat(shmid, (void *)0, 0);
strncpy(data, "TEST", SHM_SIZE);
}
char * getMsg()
{
key_t key;
int shmid;
char *msg;
key = ftok("my_test_key", 'R');
shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT);
msg = shmat(shmid, (void *)0, 0);
return msg;
}
void scrollMsg(char *buf)
{
char *p = NULL;
for (p=buf; *p != '\0'; p++) {
printf("%p\n", p);
}
}
int main (int argc, char **argv) {
char *msg = NULL;
setMsg();
do {
msg = getMsg();
printf("%s\n", msg);
scrollMsg(msg);
} while(1);
}
有人可以解释为什么会追加这个?
由于
答案 0 :(得分:1)
我的猜测是你已经用尽了你的进程地址空间。您经常附加共享内存,使操作系统为另一个附件选择另一个位置,但您永远不会分离共享区域。
答案 1 :(得分:0)
我的坏,你是对的。
这是一个有效的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024
void setMsg()
{
key_t key;
int shmid;
char *data;
key = ftok("test_key", 'R');
shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT);
data = shmat(shmid, (void *)0, 0);
strncpy(data, "TEST", SHM_SIZE);
}
char * getMsg()
{
key_t key = 0;
int shmid = 0;
char *msg = NULL;
key = ftok("test_key", 'R');
shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT);
msg = shmat(shmid, (void *)0, 0);
return msg;
}
void scrollMsg(char *buf)
{
char *p = NULL;
for (p=buf; *p != '\0'; p++) {
printf("%p\n", p);
}
}
int main (int argc, char **argv) {
char *msg = NULL;
setMsg();
msg = getMsg();
do {
printf("msg:%s\n", msg);
scrollMsg(msg);
} while(1);
}
感谢您的帮助!