打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

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

#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[i])
         printf("In parent:KEY%d pressed %d times\n",(i+1),press_cnt[i]);
        
       }  
      fd_fifo=open(FIFO,O_WRONLY);
      write(fd_fifo,press_cnt,sizeof(press_cnt));
      close(fd_fifo);
     }
    }
    unlink(FIFO);
    return 0;
}

 

编译之后就可以放到目标板上运行验证,实验的现象依然是按键按下会有相应的LED动作。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux之命名管道
嵌入式WEB视频监控小车项目指导
Linux 分区程序代码实例
【2011.03.24】播放madplay实例——kill 使用的几种情况
如何在Linux下实现定时器
Linux下第一个原创LED驱动全攻略
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服