最近开始学了linux应用编程,懂了点多进程的基础知识,便跃跃欲试,想立即应用起来,以加深印象,学任何东西重在实践,技术尤为如此。
在linux中创建新的进程的函数为fork(),如果成功返回0,如果失败返回-1。这是分叉的意思,比较形象的比喻。在一个进程进行过程中有多了个进程便岔开两道(或者多道),而新建的进程与之前创建这个进程的进程为父子关系,事实上这个新建的进程是和原来的父进程几乎一摸一样的,这是站在数据以及栈空间大小角度上而言的,只是子进程会跑到新的栈空间去运行。而且这对父子进程是完全独立的,所以数据在各自的进程中改变都互不影响。要想互传信息就需要进程间通信。这也是这篇文章所要做的事情,验证进程间通信的方式。
这里要验证的是无名管道(pipe)的通信,这种通信方式只使用与亲属关系进程间的通信,形象的说是在亲属间打通一个管道进行数据传输。
那么之前我是写了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>
int main(int argc, char **argv)
{
pid_t pid;
int fd_key;
int fd_led;
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};
int pipedes[2];
//创建管道
if((pipe(pipedes))==-1) {
perror("create pipe wrong\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) {
if((read(pipedes[0],press_cnt_tmp,sizeof(press_cnt)))==-1)
{
perror("child read error\n");
exit(EXIT_FAILURE);
}
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,0); 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);
}
if((write(pipedes[1],press_cnt,sizeof(press_cnt)))==-1)
{
perror("parent write error \n");
exit(EXIT_FAILURE);
}
}
}
return 0;
}
无名管道通信原理:
文章评论(0条评论)
登录后参与讨论