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

2012-4-9 10:52 1820 19 19 分类: MCU/ 嵌入式

之前写了无名管道方式的通信,这里就验证下有名管道的通信方式。

有名管道他和普通文件一样可以被读写,而且实际存在于存储设备中,一般也即磁盘,但是有名管道在进程结束后通信的信息就自动消失了,而一般的文件在进程结束后信息是不会变的。

这里也依然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动作。
      
    
   

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
19
关闭 站长推荐上一条 /3 下一条