免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1388 | 回复: 0
打印 上一主题 下一主题

Linux 多线程同步之命名管道 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-04 23:22 |只看该作者 |倒序浏览
命名管道(FIFO)既可用于进程间通信,也可用于线程间通信;
  FIFO是一种文件类型,一般文件I/O函数(close,read,write,unlink等)都适用于FIFO
  一、管道创建:
  #include
  int mkfifo( const char* pathname,  mode_t mode );
  //成功返回0;否则返回-1
  //mode为读写文件| 是否阻塞
  二、管道默认读写——阻塞
  a. 管道读取:如果没有线程进行写管道操作,读线程将一直阻塞,直到有线程往里面写为止
  b. 管道写:   如果没有线程进行读操作,写线程将一直阻塞,直到有线程读数据为止
  三、设置管道读写——不阻塞(O_NONBLOCK)
  a、管道读:如果没有线程进行写管道操作,读线程将立即返回
  b、 管道写:如果没有线程进行读操作,写线程将立即返回,返回错误码-1;errno: ENXIO
  示例代码:获取vmstat的参数
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  #include
  /*定义FIFO路径*/
  #define FIFO "myfifo"
  #define FILE_PATH "conf.log"
  int ncnt = 0;
  int get_siso( char* str, int* si, int* so ){
  assert( str != NULL );
  char* sub_str;
  FILE* fp = fopen( FILE_PATH, "ab+" );
  sub_str = strtok( str, " " );
  //ncnt = 0;
  while( sub_str ){
  if( sub_str != NULL && isdigit( sub_str[0] ) ){
  fprintf( fp, "  %s  \t", sub_str );
  printf( "substr[%d] = %d \n", ncnt, atoi(sub_str) );
  ncnt++;
  }
  if( ncnt == 16 ){
  ncnt = 0;
  }
  sub_str = strtok( NULL, " " );
  //sleep(0.3);
  }
  fclose( fp );
  printf( "nCnt is %d\n\n\n", ncnt );
  return 1;
  }


  int mf(){
  char buf_r[1025];
  int  fd;
  int  nread;
  printf("Preparing for reading bytes...\n");
  memset(buf_r,0,sizeof(buf_r));
  //system( "vmstat 2 > myfifo" );
  /*打开FIFO管道,不阻塞方式*/
  //fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
  fd=open(FIFO,O_RDONLY,0);
  if(fd==-1)
  {
  perror("open");
  exit(1);
  }
  while(1)
  {
  memset(buf_r,0,sizeof(buf_r));
  if((nread=read(fd,buf_r,1024))==-1){
  if(errno==EAGAIN)
  printf("no data yet\n");
  }
  sleep(2);
  printf("\n\n%s\n",buf_r);
  get_siso( buf_r, NULL, NULL );
  //sleep(1);
  }
  pause();
  return 1;
  }
  void thr_get(){
  pthread_detach( pthread_self() );
  system( "vmstat 2 > myfifo" );
  pthread_exit(0);
  }
  void thr_read(){
  pthread_detach( pthread_self() );
  pthread_t cthd;
  int stat = pthread_create( &cthd, NULL, thr_get, NULL );
  mf();
  pthread_exit(0);
  }
  int main(int argc,char** argv)
  {
  int pid;
  pthread_t cthd, dthd;
  void* tret;
  /*创建FIFO管道*/
  if((mkfifo(FIFO,O_CREAT|O_EXCL)<0)&&(errno!=EEXIST)){
  printf("cannot create fifoserver\n");
  }
  system( "chmod 777 myfifo" );
  int tsts = pthread_create( &dthd, NULL, thr_read, NULL );
  pthread_join( dthd, &tret );
  printf( "tsts is %d\n", tsts );
  sleep( 60 );
  unlink(FIFO);
  }
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/106123/showart_2178138.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP