http://blog.csdn.net/guoping16/article/details/6584058 讲的很详细,可惜第一个示例有点问题,第一个示例修改如下:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <error.h>
#define SIZE 1024
int main()
{
int shmId ;
void *shmAddr;
char *shmData;
struct shmid_ds shmBuf ;
int shmFlag = 0 ;
int pid ;
shmId = shmget(IPC_PRIVATE, SIZE, IPC_CREAT|0600 ) ;
if ( shmId < 0 )
{
perror("get shm ipc_id error") ;
return -1 ;
}
pid = fork() ;
if ( pid == 0 )
{
shmAddr = (char *)shmat( shmId, NULL, 0 ) ;
if ( shmAddr == (void *)-1 )
{
perror("shmat addr error") ;
return -1 ;
}
shmData = (char *) shmAddr;
strcpy( shmData, "Hi, I am child process!\n") ;
shmdt( shmAddr ) ;
return 0;
} else if ( pid > 0) {
sleep(3 ) ;
shmFlag = shmctl( shmId, IPC_STAT, &shmBuf) ;
if ( shmFlag == -1 )
{
perror("shmctl shm error") ;
return -1 ;
}
printf("shm_segsz =%d bytes\n", shmBuf.shm_segsz ) ;
printf("parent pid=%d, shm_cpid = %d \n", getpid(), shmBuf.shm_cpid ) ;
printf("chlid pid=%d, shm_lpid = %d \n",pid , shmBuf.shm_lpid ) ;
shmAddr = shmat(shmId, NULL, 0 ) ;
if ( shmAddr == (void *)-1 )
{
perror("shmat addr error") ;
return -1 ;
}
shmData = (char *) shmAddr;
printf("%s", shmData);
shmdt( shmAddr );
shmctl(shmId, IPC_RMID, NULL) ;
}else{
perror("fork error") ;
shmctl(shmId, IPC_RMID, NULL) ;
}
return 0 ;
}
运行:
$ gcc test.c
$ ./a.out
shm_segsz =1024 bytes
parent pid=7617, shm_cpid = 7617
chlid pid=7618, shm_lpid = 7618
Hi, I am child process!