全部博文(118)
分类: LINUX
2008-06-19 09:20:49
进程间通信的方式:有名管道。我这是一个串口的控制程序,用来控制数据的发送和接收,当没有数据进入和没有数据需要向外发送的时候,进程释放cpu,但是我发现,数据的发送是别的进程通过有名管道传递给该进程的,PIPE_GPRS是有名管道,有名管道通过mknod来建立。结果我就发现,在opne该有名管道的时候使用的是O_NONBLOCK非阻塞方式,结果open没有被阻塞,打印出了open ok!,但是在从该管道读数据的时候,系统被阻塞了!!!程序无法实现我想要的目的,为什么,我记得read是不会造成阻塞的阿,如果没有数据就会立即返回的。普通文件的读写时不会出现阻塞的情况,但是管道的读写是会出现阻塞情况的,非阻塞的标志可以在open中设置,而我设置了也没有作用,难道逼我用信号量加普通文件的方式来进行进程间的通信???
while(1)
{
usleep(60000);
if((rc=read(fd,&readbuf[no],1))>0)
{
no+=rc;
if(readbuf[no-1]=='\r')
{
end=memchr(readbuf,'+',no);
if(end!=0)
{
readbuf[no]='\0';
gettimeofday(&tvEnd, NULL);
printf("time=%d second,%d usecond!\n\r",tvEnd.tv_sec,tvEnd.tv_usec);
printf("no=%d\r\n",no);
printf("receive=%s\n\r",end);
no=0;
}
}
}
if((pipe_fd=open(PIPE_GPRS,O_RDWR|O_NONBLOCK)>0))
{
printf("open ok!\n");
if((start=read(pipe_fd,writebuf,400))>0)
printf("read %s from FIFO_PIPE!\n",writebuf);
}
}
好久好久没有上来,这一段时间太忙了,压力也很大,反正有很多的事情,其实这个问题当时就解决了,
if((pipe_fd=open(PIPE_GPRS,O_RDWR|O_NONBLOCK)>0))
{
printf("open ok!\n");
open这句话的括号打错位置了,应该要写在
if((pipe_fd=open(PIPE_GPRS,O_RDWR|O_NONBLOCK))>0)
{
printf("open ok!\n");
这样就正确了!!!