- 論壇徽章:
- 0
|
目前在看書的時候看到進(jìn)程間通信共享內(nèi)存的一個例子本來就打算很簡單的去linux上調(diào)試一下,結(jié)果發(fā)生非常讓我難以理解的問題,我已經(jīng)糾結(jié)一個晚上了。
主要問題是:
1、在shmget和shmat函數(shù)都沒有問題,但是在使用shmat得到地址后無法對地址進(jìn)行操作,我是在發(fā)現(xiàn)沒有看到預(yù)期的打印后一步步加打印進(jìn)行調(diào)試的,發(fā)現(xiàn)shmat后對addr無法操作。
2、還有一個問題是同一個父進(jìn)程產(chǎn)生的幾個子進(jìn)程在使用shmat結(jié)果會一樣嗎?我試了幾次結(jié)果都會一樣的。但是看之前有帖子討論貌似會不一樣的。
具體的代碼如下:
#include <stdio.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <stdlib.h>
#define SHMKEY 75
int shmid, i;
int *addr;
void CLIENT()
{
printf("client\n");
int i = 9;
shmid = shmget(SHMKEY, 1024, 0777);
if (-1 == shmid)
{
printf("create client key error\n");
}
addr = (int *)shmat(shmid, NULL, 0);
if ((int *)-1 == addr)
{
printf("create client addr error\n");
}
else
{
printf("client addr %p\n", addr);
}
for(i = 9; i >= 0; i--)
{
printf("client_here1\n");
while(*addr != -1);
printf("client_here2\n");
*addr = i;
printf("client sent %d\n", *addr);
}
printf("out client\n");
exit(0);
}
void SERVER()
{
printf("server\n");
shmid = shmget(SHMKEY, 1024, 0777|IPC_CREAT);
if (-1 == shmid)
{
printf("create server key error\n");
}
addr = (int *)shmat(shmid, NULL, 0);
if ((int *)-1 == addr)
{
printf("create server addr error\n");
}
else
{
printf("server addr %p\n", addr);
}
do
{
printf("server_here1\n");
*addr = -1;
printf("server_here2\n");
while(*addr == -1);
printf("server received %d\n", *addr);
}while(*addr);
shmctl(shmid, IPC_RMID, 0);//最后一個參數(shù)*buf
printf("out server\n");
exit(0);
}
void main()
{
printf("in\n");
while((i = fork()) == -1);
if(!i) SERVER();
while((i = fork()) == -1);
if(!i) CLIENT();
wait(NULL);
wait(NULL);
printf("out\n");
}
ubuntu 12.04調(diào)試結(jié)果是:
(我一共運行了很多次,截取其中三次)
in
server
server addr 0xfffffffff1d95000
server_here1
client
client addr 0xfffffffff1d95000
client_here1
out
/////////////////////////////////////////////
in
server
server addr 0x1f2c7000
server_here1
client
client addr 0x1f2c7000
client_here1
out
/////////////////////////////////
in
client
client addr 0xffffffff96122000
client_here1
server
server addr 0xffffffff96122000
server_here1
out
跪謝給位大大們的幫助!。 |
|