原创 【博客大赛】(原创)linux进程间通信之无名管道(pipe)的简单应用

2012-4-9 10:51 1873 23 23 分类: MCU/ 嵌入式

最近开始学了linux应用编程,懂了点多进程的基础知识,便跃跃欲试,想立即应用起来,以加深印象,学任何东西重在实践,技术尤为如此。

在linux中创建新的进程的函数为fork(),如果成功返回0,如果失败返回-1。这是分叉的意思,比较形象的比喻。在一个进程进行过程中有多了个进程便岔开两道(或者多道),而新建的进程与之前创建这个进程的进程为父子关系,事实上这个新建的进程是和原来的父进程几乎一摸一样的,这是站在数据以及栈空间大小角度上而言的,只是子进程会跑到新的栈空间去运行。而且这对父子进程是完全独立的,所以数据在各自的进程中改变都互不影响。要想互传信息就需要进程间通信。这也是这篇文章所要做的事情,验证进程间通信的方式。

这里要验证的是无名管道(pipe)的通信,这种通信方式只使用与亲属关系进程间的通信,形象的说是在亲属间打通一个管道进行数据传输。

那么之前我是写了led和按键驱动的,所以直接可以用上之前的驱动。


按键和LED的模块连接:

LED:http://bbs.ednchina.com/BLOG_ARTICLE_3002404.HTM

按键:http://bbs.ednchina.com/BLOG_ARTICLE_3002953.HTM


以下我直接贴出应用程序代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>

int main(int argc, char **argv)
{
    pid_t pid;
    int fd_key;
    int fd_led;
    int val;
    int i;
    int press_cnt[6]={0,0,0,0,0,0};
    int press_cnt_tmp[6]={0,0,0,0,0,0};
    int pipedes[2];

//创建管道
    if((pipe(pipedes))==-1) {
    perror("create pipe wrong\n");
    exit(EXIT_FAILURE);
    }

    pid = fork();
    if(pid==-1) {
    printf("fork error \n");
    exit(EXIT_FAILURE);
    }


    else if(pid==0) {
     fd_led = open("/dev/s3c6410leds",0);
     if(fd_led<0) {
     printf("open led error\n");
     exit(EXIT_FAILURE);
     }
     printf("open led succeed\n");
     while(1) {
     if((read(pipedes[0],press_cnt_tmp,sizeof(press_cnt)))==-1)
     {
      perror("child read error\n");
      exit(EXIT_FAILURE);
     }
     if(press_cnt_tmp[0]) { ioctl(fd_led,1,0); printf("in child:key1 pressed\n"); }
     if(press_cnt_tmp[1]) { ioctl(fd_led,1,1); printf("in child:key2 pressed\n"); }
     if(press_cnt_tmp[2]) { ioctl(fd_led,1,2); printf("in child:key3 pressed\n"); }
     if(press_cnt_tmp[3]) { ioctl(fd_led,1,3); printf("in child:key4 pressed\n"); }
     if(press_cnt_tmp[4]) { ioctl(fd_led,0,3); printf("in child:key5 pressed\n"); }
     if(press_cnt_tmp[5]) { ioctl(fd_led,0,0); printf("in child:key6 pressed\n"); }
     }
    }

    else {
    fd_key = open("/dev/keyint",0);
    if(fd_key<0) {
    printf("open key error\n");
    exit(EXIT_FAILURE);
    }
     printf("open key succeed\n");
     while(1) {
     val = read(fd_key,press_cnt,sizeof(press_cnt));
    
      if(val<0) {
      printf("read error\n");
      exit(EXIT_FAILURE);
      }

       for(i=0;i<6;i++) {
         if(press_cnt)
         printf("In parent:KEY%d pressed %d times\n",(i+1),press_cnt);         
       }  
      if((write(pipedes[1],press_cnt,sizeof(press_cnt)))==-1)
      {
      perror("parent write error \n");
      exit(EXIT_FAILURE);
      }
     }
    }

    return 0;
}
      
无名管道通信原理:

11.jpg
然后编译成应用程序就可以放到目标板上运行了,按下按键,LED会做相应的动作。

文章评论0条评论)

登录后参与讨论
我要评论
0
23
关闭 站长推荐上一条 /2 下一条