/*
*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);
*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);
}
結果: