之前写了无名管道方式的通信,这里就验证下有名管道的通信方式。
有名管道他和普通文件一样可以被读写,而且实际存在于存储设备中,一般也即磁盘,但是有名管道在进程结束后通信的信息就自动消失了,而一般的文件在进程结束后信息是不会变的。
这里也依然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动作。
文章评论(0条评论)
登录后参与讨论