进程通信实例之父子进程通信

参考

/* 父子进程通信范例 */
#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;
}


猜你喜欢

转载自blog.csdn.net/deggfg/article/details/22595615