共享内存程序中的意外输出
Posted
技术标签:
【中文标题】共享内存程序中的意外输出【英文标题】:Unexpected Output In Shared Memory Program 【发布时间】:2017-02-15 03:02:49 【问题描述】:我有一个服务器,它创建一些共享内存空间并将“hello world”放入其中,一个客户端应该查看该共享内存空间并相应地将“hello world”打印到控制台;但是,相反,我只是得到一个“*”字符,并且服务器没有按预期终止。以下是代码,感谢您对如何解决此问题的任何见解。
服务器.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHSIZE 100
int main(int argc, char *argv[])
int shmid;
key_t key;
char *shm;
char *s;
key = 9876;
shmid = shmget(key, SHSIZE, IPC_CREAT | 0666);
if (shmid < 0)
perror("shmget");
exit(1);
shm = shmat(shmid, NULL, 0);
if (shm == (char *) -1)
perror("shmat");
exit(1);
memcpy(shm, "Hello World", 11);
s = shm;
s += 11;
*s = 0;
while (*shm != '*')
sleep(1);
shmdt (shm); // detach
shmctl (shmid, IPC_RMID, 0); //deallocate
return 0;
client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHSIZE 100
int main(int argc, char *argv[])
int shmid;
key_t key;
char *shm;
char *s;
key = 9876;
shmid = shmget(key, SHSIZE, IPC_CREAT | 0666);
if (shmid < 0)
perror("shmget");
exit(1);
shm = shmat(shmid, NULL, 0);
if (shm == (char *) -1)
perror("shmat");
exit(1);
for (s = shm; *s != 0; s++)
printf("%c", *s);
printf("\n");
*shm = '*';
return 0;
【问题讨论】:
【参考方案1】:我已经在一个使用 gcc 版本的 opensuse 42.1 机器上尝试了你的程序
gcc 版本 4.8.5 (SUSE Linux) 和以下是输出。您的程序很好,并按预期提供输出。请遵循以下详细信息。
/WorkDir/checks/stackover> gcc -Wall -Wextra -O2 -o unx_sh_server unx_sh_server.c
unx_sh_server.c: In function ‘main’:
unx_sh_server.c:12:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
int main(int argc, char *argv[])
^
unx_sh_server.c:12:26: warning: unused parameter ‘argv’ [-Wunused-parameter]
int main(int argc, char *argv[])
^
/WorkDir/checks/stackover> gcc -Wall -Wextra -O2 -o unx_sh_client unx_sh_client.c
unx_sh_client.c: In function ‘main’:
unx_sh_client.c:11:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
int main(int argc, char *argv[])
^
unx_sh_client.c:11:26: warning: unused parameter ‘argv’ [-Wunused-parameter]
int main(int argc, char *argv[])
/WorkDir/checks/stackover> ls -rlt
total 40
-rw-r--r-- 1 progra users 761 Feb 15 09:29 unx_sh_server.c
-rw-r--r-- 1 progra users 643 Feb 15 09:29 unx_sh_client.c
-rwxr-xr-x 1 progra users 12768 Feb 15 09:30 unx_sh_server
-rwxr-xr-x 1 progra users 12664 Feb 15 09:30 unx_sh_client
/WorkDir/checks/stackover> ./unx_sh_server &
[1] 12180
/WorkDir/checks/stackover>
/WorkDir/checks/stackover>
/WorkDir/checks/stackover> ./unx_sh_client
Hello World
/WorkDir/checks/stackover> fg
bash: fg: job has terminated`enter code here`
[1]+ Done ./unx_sh_server
/WorkDir/checks/stackover>
请检查您运行客户端和服务器的方式。
【讨论】:
以上是关于共享内存程序中的意外输出的主要内容,如果未能解决你的问题,请参考以下文章