锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
浠g爜濡備笅錛?br>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define SHM_SIZE 1024 /* shared memory size(bytes) */
#define SHM_MODE 0600 /* user read/write */
#define WRITE_LOCK(fd) regLock((fd), F_SETLKW, F_WRLCK, 0, SEEK_SET, 0)
#define UN_LOCK(fd) regLock((fd), F_SETLK, F_UNLCK, 0, SEEK_SET, 0)
/* 鍒涘緩涓涓枃浠?nbsp;*/
int createFile()
{
int fd;
if ( (fd = open("/tmp/emptyfile4shm", O_RDWR | O_CREAT, 0666)) < 0) {
fprintf(stderr, "Create a empty file failed!\n");
exit(EXIT_FAILURE);
}
return fd;
}
/* 鍦ㄦ枃浠秄d涓婂姞閿佹垨瑙i攣*/
int regLock(int fd, int cmd, int type, off_t offset, int whence, off_t len)
{
struct flock lock;
lock.l_type = type; /* lock type: F_RDLCK, F_WRLCK, F_UNLCK */
lock.l_start = offset; /* byte offset relative to l_whence */
lock.l_whence = whence; /* it's value : SEEK_SET, SEEK_CUR, SEEK_END */
lock.l_len = len; /* bytes (0 means to EOF) */
return fcntl(fd, cmd, &lock);
}
int main(void)
{
int shmid;
int filed;
pid_t pid;
char *shmptr = NULL;
filed = createFile();
if ( (shmid = shmget(IPC_PRIVATE, SHM_SIZE, SHM_MODE)) < 0) { /* Create shared memory */
fprintf(stderr, "Create shared memory failed!\n");
exit(EXIT_FAILURE);
}
if ( (pid = fork()) < 0) { /* Create a child process */
fprintf(stderr, "Create child process failed!\n");
exit(EXIT_FAILURE);
}
if (pid == 0) { /* In child process */
if ( (shmptr = shmat(shmid, 0, 0)) == (void *)-1) {
fprintf(stderr, "Attached shared memory failed!\n");
exit(EXIT_FAILURE);
}
while (1) {
WRITE_LOCK(filed); /* add a write lock to filed */
/* shared memory 鍓╀綑鐨勭┖闂翠笉鑳藉瓨鍌?Child"瀛楃涓插拰緇撴潫絎?鏃跺氨閫鍑哄驚鐜?nbsp;*/
if (SHM_SIZE - strlen(shmptr) < strlen("Child") + 1) break;
strcat(shmptr, "C"); /* 鐢變簬鍔犱簡閿侊紝姣忎釜Child灝嗕細(xì)榪炵畫鍑虹幇 */
strcat(shmptr, "h");
strcat(shmptr, "i");
strcat(shmptr, "l");
strcat(shmptr, "d");
UN_LOCK(filed); /* release lock */
}
printf("child process:\n\t%s\n", shmptr); /* child process print shared memory */
exit(0);
}
/* In parent process */
if ( (shmptr = shmat(shmid, 0, 0)) == (void *)-1) { /* Attached shared memory */
fprintf(stderr, "Attached shared memory failed!\n");
exit(EXIT_FAILURE);
}
while (1) {
WRITE_LOCK(filed);
/* shared memory 鍓╀綑鐨勭┖闂翠笉鑳藉瓨鍌?Parent"瀛楃涓插拰緇撴潫絎?鏃跺氨閫鍑哄驚鐜?nbsp;*/
if (SHM_SIZE - strlen(shmptr) < strlen("Parent") + 1) break;
strcat(shmptr, "P");/* 鐢變簬鍔犱簡閿侊紝姣忎釜Parent灝嗕細(xì)榪炵畫鍑虹幇 */
strcat(shmptr, "a");
strcat(shmptr, "r");
strcat(shmptr, "e");
strcat(shmptr, "n");
strcat(shmptr, "t");
UN_LOCK(filed);
}
printf("parent process:\n\t%s\n", shmptr); /* parent print shared memory */
wait(0);
exit(0);
}
]]>
linux鍐呮牳瀹氫箟鐨剆hared memory緇撴瀯shmid_ds濡備笅錛?br>
struct ipc_perm shm_perm; /*鏉冮檺*/
size_t shm_segsz; /*澶у皬*/
pid_t shm_lpid;
pid_t shm_cpid; /*鍒涘緩鑰卲id*/
shmatt_t shm_nattch;/*榪炴帴鍒版孌靛唴瀛樼殑榪涚▼鏁?/span>*/
time_t shm_atime;
time_t shm_dtime;
time_t shm_ctime;

};
1銆佸垱寤烘垨浣跨敤涓孌靛叡浜唴瀛樹嬌鐢╯hmget鍑芥暟錛屾鍑芥暟灝嗚繑鍥炲叡浜唴瀛樻爣紺虹銆?br>
int shmget(key_t key, size_t size, int flag);
2銆佸涓涓叡浜唴瀛樻榪涜鎿嶄綔浣跨敤shmctl銆?br>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
cmd鎸囧畾闇瑕佽繘琛岀殑鎿嶄綔
IPC_STAT鍙栧緱姝ゆ鐨剆hmid_ds緇撴瀯鏀懼叆buf涓?br> IPC_SET鐢╞uf鐨勫艱緗孌典腑鐨勶細(xì)shm_perm.uid錛宻hm_perm.gid錛宻hm_perm.mode銆?br> IPC_RMID浠庣郴緇熶腑鍒犻櫎姝ゅ叡浜唴瀛樻銆?br> SHM_LOCK灝嗗叡浜唴瀛橀攣瀹氬埌鍐呭瓨涓?br> SHM_UNLOCK瑙i攣鍏變韓鍐呭瓨孌點?br>
3銆佸皢涓涓叡浜唴瀛樻榪炴帴鍒拌嚜宸辯殑鍦板潃絀洪棿浣跨敤shmat錛?br>
void *shmat(int shmid, const void *addr, int flag);
4銆佸鍏變韓鍐呭瓨鎿嶄綔緇撴潫鍚庯紝瑕佽劚紱昏孌電敤shmdt錛?br>
int shmdt(void *addr);
]]>
]]>