Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1638476
  • 博文数量: 197
  • 博客积分: 10046
  • 博客等级: 上将
  • 技术积分: 1983
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 12:36
个人简介

在外企做服务器开发, 目前是项目经理, 管理两个server开发的项目。不做嵌入式好久了。

文章分类
文章存档

2011年(2)

2010年(6)

2009年(18)

2008年(30)

2007年(100)

2006年(41)

分类: LINUX

2006-12-14 13:20:55

用pipe的方式实现父子进程通信。

父进程创建了一个无名管道, 子进程在管道写端写入value , 父进程通过select()函数检测管道的读端,如果5秒钟内读端无反应,说明超时,否则就可以读value! 这样就是简单的实现父子进程同步,通信,且有限时间等待的要求!

pid_t pid = 0;
int fd[2];                //pipe operation :

unsigned char share_buffer[3];    //share info between parent process and child process


fd_set read_fds;
int fd_max ;      /* for select */
struct timeval tv;
int select_rc = 0;


if(pipe(fd) < 0)
{
    perror("create pipe");
    return SERVER_PIPE_FAIL;
}

signal(SIGCHLD,SIG_IGN);    //防止出现Zombie 进程,如果忘记了,复习一下上面!


pid = fork();
if(pid < 0) {
    perror("fork a child to download file failure");
    return SERVER_FORK_FAIL;
}
else if(pid == 0) {
    unsigned char buffer[3]; //子进程往里面写数据

    int rc = -1;

    setsid();
    /* generate a daemon process
    * setsid()是创建daemon的关键函数,(1)成为session的leader process ,
    *(2)成为进程组的leader process ,(3)没有终端
    */

    umask(0);
    /* 当创建文件的时候和目录的时候 默认是 umask(022) ,
    * umask()函数可以改便创建文件时候的默认许可权位 , 据个例子,当你用root权限
    * 创建一个文件 , > bob.txt ,你会发现: ll bob.txt , 显示 -rw-r--r-- ,
    * 这就是umask(022)的作用 , 022 对应的二进制: 000 010 010 ,表示 对于
    * 组内用户和其他的用户 不可有w的权限。 w位置1 就表示不可以w !以此类推!
    */

    close(0);     //关闭标准输入

    close(1);    //关闭标准输出

    close(2);    //关闭标准错误输出

    chdir("/");

    close(fd[0]);    //把管道的读 一端 关闭 ,只留写 一端 即可


    //执行你的程序 ,你的code

    。。。
    //在exit(0)之前,通知你的父进程你的执行结果, rc就是执行结果


    buffer[0] = rc;
    buffer[1] = '\0';
    buffer[2] = '\0';
    write(fd[1],buffer,sizeof(buffer));
    close(fd[1]);    //end of write to the "write pipe" ,must close it

    exit(0);
    } //子进程结束!

    //父进程内

    close(fd[1]);    //关闭写端 ,只要留着读端即可!


    FD_ZERO(&read_fds);    //clear the read_fds

    FD_SET(fd[0], &read_fds);

    tv.tv_sec = 5 //假设父进程就等待5s

    fd_max = fd[0]+1;

    //select 不熟悉select()的朋友可以到google搜索它的用法,一定要掌握!

    select_rc = select(fd_max,&read_fds,NULL,NULL,&tv);

    if(!select_rc) //wait超时 ,

    //你的处理code , 也许这正是你期待的呢!

    else {
    read(fd[0],share_buffer,sizeof(share_buffer));
    jprintf("read successfully\n");
    jprintf("in father :buffer[0] = %d\n",share_buffer[0]);
    jprintf("in father :buffer[1] = %d\n",share_buffer[1]);
    jprintf("in father :buffer[2] = %d\n",share_buffer[2]);
    close(fd[0]);    //close read pipe , 读完毕后记着关闭它!


    //你可以根据buffer读出的内容作进一步的处理

    //你的code

    }

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