热度 19
2012-4-9 10:52
1821 次阅读|
0 个评论
之前写了无名管道方式的通信,这里就验证下有名管道的通信方式。 有名管道他和普通文件一样可以被读写,而且实际存在于存储设备中,一般也即磁盘,但是有名管道在进程结束后通信的信息就自动消失了,而一般的文件在进程结束后信息是不会变的。 这里也依然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 ={0,0,0,0,0,0}; int press_cnt_tmp ={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_led0) { 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 ) { ioctl(fd_led,1,0); printf("in child:key1 pressed\n"); } if(press_cnt_tmp ) { ioctl(fd_led,1,1); printf("in child:key2 pressed\n"); } if(press_cnt_tmp ) { ioctl(fd_led,1,2); printf("in child:key3 pressed\n"); } if(press_cnt_tmp ) { ioctl(fd_led,1,3); printf("in child:key4 pressed\n"); } if(press_cnt_tmp ) { ioctl(fd_led,0,3); printf("in child:key5 pressed\n"); } if(press_cnt_tmp ) { ioctl(fd_led,0,1); printf("in child:key6 pressed\n"); } } } else { fd_key = open("/dev/keyint",0); if(fd_key0) { 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(val0) { printf("read error\n"); exit(EXIT_FAILURE); } for(i=0;i6;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动作。