Chinaunix首页 | 论坛 | 博客
  • 博客访问: 642168
  • 博文数量: 128
  • 博客积分: 4385
  • 博客等级: 上校
  • 技术积分: 1546
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 14:05
文章分类

全部博文(128)

文章存档

2012年(2)

2011年(51)

2010年(75)

分类: LINUX

2010-08-25 14:12:35

进程通信----共享内存
父子进程之间为例:
流程:
1. 创建共享内存
2. 创建子进程
3. 父进程中  映射内存  向内存写数据strncpy  wait同步子进程
4. 子进程中  映射内存  等待父进程写入sleep  操作内存(可读)
 

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

#define PERM S_IRUSR|S_IWUSR

int main(int argc, char **argv)
{
    int shmid;
    char *f_addr, *c_addr;

    if(argc != 2)
    {
        printf("Usage: ./shm ni hao \n");
        exit(1);
    }
    if((shmid = shmget(IPC_PRIVATE, 1024, PERM)) < 0) // (()())()

    {
        printf("shmget error:%s\n", strerror(errno));
        exit(1);
    }
    printf("shmget ok!\n");
/*    if( fork() < 0)
    {
        printf("fork error:%s\n", strerror(errno));
        exit(1);
    }*/

    if(fork())
    {
        printf("father process...\n");
        f_addr = shmat(shmid, 0, 0);
        memset(f_addr, '\0', 1024);
        strncpy(f_addr, argv[1],1024);
        printf("father exit!\n");
        wait(NULL);
//        sleep(3);


    }
    else
    {
        sleep(1);
        printf("child process...\n");
        c_addr = shmat(shmid, 0, 0);
        printf("client get:%s\n", c_addr);
    }
}


易错点:

1.int main(int argc, char **argv)

    主函数**argv

2.if((shmid = shmget(IPC_PRIVATE, 1024, PERM)) < 0) // (()())()

先将赋值括起来,然后与0比较, 注意内存属性的描述

3. memset(f_addr, '\0', 1024);

    映射之后,写之前要初始化内存。

4.wait(NULL);   

先执行的进程要等待后执行的进程!          (PS:字体颜色较乱,没法改,我不会操作)

阅读(1435) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-08-27 08:46:14

Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com