首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

linux进程间通信之有名管道(FIFO)的简单应用

linux进程间通信之有名管道(FIFO)的简单应用

有名管道他和普通文件一样可以被读写,而且实际存在于存储设备中,一般也即磁盘,但是有名管道在进程结束后通信的信息就自动消失了,而一般的文件在进程结束后信息是不会变的。
这里也依然y用按键和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>
#include <fcntl.h>
#define FIFO "/tmp/tmp1/fifo_test"
int main(int argc, char **argv)
{
     pid_t pid;
     int fd_key;
     int fd_led;
     int fd_fifo;
     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};
     unlink(FIFO);  //如果存在先删除他
     if((mkfifo(FIFO,0744))==-1) {
      perror("mkfifo error\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) {
      fd_fifo=open(FIFO,O_RDONLY);
      read(fd_fifo,press_cnt_tmp,sizeof(press_cnt_tmp));
      close(fd_fifo);
      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,1); 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);
         
        }  
       fd_fifo=open(FIFO,O_WRONLY);
       write(fd_fifo,press_cnt,sizeof(press_cnt));
       close(fd_fifo);
      }
     }
     unlink(FIFO);
     return 0;
}

编译之后就可以放到目标板上运行验证,实验的现象依然是按键按下会有相应的LED动作。
返回列表