/* 父子进程通信范例 */
#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;
char *shmaddr;
struct shmid_ds buf; /* 结构体定义 */
int flag = 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 ( 0 == pid )
{
shmaddr = (char *) shmat (shmid, NULL, 0); /* 把共享内存区对象映射到调用进程的地址空间,后面有删除的对应 */
if (-1 == (int) shmaddr)
{
perror ("shmat addr error") ;
return -1;
}
strncpy (shmaddr, "Hi, I am child process!\n", SIZE - 1);
shmaddr[SIZE - 1] = '\0';
shmdt (shmaddr); /* 断开共享内存连接,对应shmat() */
return 0;
}
else if (pid > 0)
{
sleep(3);
flag = shmctl (shmid, IPC_STAT, &buf); /* 完成对共享内存的控制,
* 这里是得到共享内存的状态,
* 还有改变共享内存状态和删除共享内存*/
if (-1 == flag)
{
perror ("shmctl shm error");
return -1;
}
/* 注意分析下面的结果输出 */
printf ("shm_segsz =%d bytes\n", buf.shm_segsz);
printf ("parent pid=%d, shm_cpid = %d \n", getpid(), buf.shm_cpid);
printf ("chlid pid=%d, shm_lpid = %d \n", pid, buf.shm_lpid);
shmaddr = (char *) shmat (shmid, NULL, 0 ); /* 把共享内存区对象映射到调用进程的地址空间,对应shmdt() */
if (-1 == (int) shmaddr)
{
perror ("shmat addr error") ;
return -1 ;
}
printf ("%s", shmaddr);
shmdt (shmaddr); /* 断开共享内存连接,对应shmat() */
shmctl (shmid, IPC_RMID, NULL); /* 共享内存管理,删除共享内存,对应shmget的【创建】 */
}
else
{
perror ("fork error");
shmctl (shmid, IPC_RMID, NULL); /* 共享内存管理,删除共享内存 */
}
return 0;
}
进程通信实例之父子进程通信
最新推荐文章于 2024-06-16 23:18:29 发布