Chinaunix

标题: 实时进程通信问题,急! [打印本页]

作者: ferris2005    时间: 2010-03-09 15:47
标题: 实时进程通信问题,急!
小弟想使子进程实时监控然后条件满足后给父进程发送信号同时写管道,父进程查询信号处理后的变量接着读管道,但是程序结果总是子进程能发送,信号响应能输出,但是父进程无法读取管道!
代码如下:
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <sys/signal.h>
#include <signal.h>


char child[]="Message!";
char device[]="/dev/ttyS0";
int flag=1;
int fd;
struct termios newtio,oldtio;

void init_ttyS(int fd);
void signal_handler(int signumber,siginfo_t *info,void *extra);

main()
{
       pid_t  pid_parent,pid_child;
       int pipe1[2];
      char buf[20];
      char buff;
      int i=0,j=0;
      int res;
       struct sigaction saio;
     //  union sigval mysigval;
     //  mysigval.sival_int=1;
        if(pipe(pipe1)==-1)  {printf("Pipe creat error!");exit(1);}

    pid_parent=getpid();
      printf("Source PID is %d.\n",pid_parent);
    fd = open(device, O_RDWR);                                 // 打开设备
     if (fd <0)
          {
            printf("Uart0 error!");
            exit(-1);
          }
     init_ttyS(fd);
        
     pid_child=fork();
        if(pid_child==-1)
            {
                perror("pid_chikdw fork failed!");
                exit(1);
             }

        else if(pid_child==0)
             {

        while(i<100)
        {
              printf("!");
                        res=read(fd,&buff,1);
                        usleep(500000);
             if(res>=0)
                {
                if(buff=='~')
                    {   
                       buff='\0';
                      close(pipe1[0]);
                                write(pipe1[1],child,sizeof(child));
                      close(pipe1[1]);
                                kill(pid_parent,SIGUSR1);
                      //sigqueue(getppid(),SIGUSR1,mysigval);
                      //break;                                               
                     }
                                               
                  }
                                       
        i++;
                  }                       
             }

        else
                 {       
          printf("Parent PID is :%d.\n",getpid());
          sigemptyset(&saio.sa_mask);
                    saio.sa_sigaction = &signal_handler;
                    saio.sa_flags = SA_SIGINFO;
                    if(sigaction(SIGUSR1,&saio,NULL)<0)
                      {
                        printf("Error");
                       }

                     while(1)
            {  
                                    while(!flag)
                                        usleep(100000);   
                                     flag=1;
                                     close(pipe1[1]);
                                     if(read(pipe1[0],buf,20)>0)
                       {
                        printf("child message:%s[%d]",buf,flag);       
                        }

            }
                          
         }
  

tcsetattr(fd,TCSANOW,&oldtio);
         
}

void init_ttyS(int fd)
{
        //struct termios newtio;
        tcgetattr(fd,&oldtio); /* save current port settings */
        bzero(&newtio, sizeof(newtio));
        tcgetattr(fd, &newtio);                                        // 得到当前串口的参数
        cfsetispeed(&newtio, B115200);                                // 将输入波特率设为19200
        cfsetospeed(&newtio, B115200);                                // 将输出波特率设为19200
        newtio.c_cflag |= (CLOCAL | CREAD);                        // 使能接收并使能本地状态
        newtio.c_cflag &= ~PARENB;                                // 无校验 8位数据位1位停止位
        newtio.c_cflag &= ~CSTOPB;
        newtio.c_cflag &= ~CSIZE;
        newtio.c_cflag |= CS8;
        newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);        // 原始数据输入
        newtio.c_oflag &= ~(OPOST);

        newtio.c_cc[VTIME]    = 0;                                   // 设置等待时间和最小接收字符数
        newtio.c_cc[VMIN]     = 0;   

        tcflush(fd, TCIFLUSH);                                        // 处理未接收的字符
        tcsetattr(fd,TCSANOW,&newtio);                                 // 激活新配置
        printf("Init end\n");
}


void signal_handler(int signumber,siginfo_t *info,void *extra)
{

        flag=0;
        printf("Receve signal from %d![%d]\n",signumber,flag);

}
作者: wesleyluo    时间: 2010-03-11 15:27
这个我还没学,只能帮你顶下了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2