sharmemory.c(linux下的共享內存使用實例)

/*
 *Filename: sharmemry.c
 *Description: 利用fork函數創建子進程後,父進程先等待子進程中用戶輸入字符串寫入共享內存,之後在共享內存尾部寫入end。
父進程隨後將共享內存的信息打印在終端上。
 */


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>


#define BUFFERSIZE 1024


int main()
{
int shmid;
pid_t pid;
void *shmadress;
char buf[BUFFERSIZE];


//創建共享內存
shmid = shmget((key_t)1234,BUFFERSIZE,0666 | IPC_CREAT); 
if(shmid == -1)
{
perror("shmget error");
exit(-1);
}
else
{
printf("sharmemory shmid = %d\n",shmid);
}


//創建子進程
pid = fork();
if(pid == -1)
{
perror("fork error");
exit(-1);
}
else if(pid == 0) // 進入子進程
{
//映射共享內存
shmadress = shmat(shmid,NULL,0);
if(shmadress == (void *)-1)
{
perror("in child process,shamt error");
exit(-1);
}

//子進程中,向共享內存寫入數據
printf("input:");
fgets(buf,BUFFERSIZE,stdin);
//寫入共享內存,並在末尾添加end
strncpy(shmadress,buf,strlen(buf));
strncpy(shmadress+strlen(buf)-1,"end",3);

//解除共享映射內存
if(shmdt(shmadress) < 0)
{
perror("in chid process,shmdt error");
exit(-1);
}
}
else //進入父進程
{
//等待子進程完成
wait(NULL);
shmadress = shmat(shmid,NULL,0);
if(shmadress == (void *)-1)
{
perror("in parent process,shmat error");
exit(-1);
}

strcpy(buf,shmadress);
printf("The message is: %s\n",buf);

//解除共享內存的映射
if(shmdt(shmadress) < 0)
{
perror("in parent process,shmdt error");
exit(-1);
}

//刪除共享內存
if(shmctl(shmid,IPC_RMID,NULL) < 0)
{
printf("in parent process,shmctl error");
exit(-1);
}
}

exit(0);

}




結果:


發佈了60 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章