亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1415 | 回復: 0
打印 上一主題 下一主題

Linux 多線程同步之命名管道 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-02-04 23:22 |只看該作者 |倒序瀏覽
命名管道(FIFO)既可用于進程間通信,也可用于線程間通信;
  FIFO是一種文件類型,一般文件I/O函數(shù)(close,read,write,unlink等)都適用于FIFO
  一、管道創(chuàng)建:
  #include
  int mkfifo( const char* pathname,  mode_t mode );
  //成功返回0;否則返回-1
  //mode為讀寫文件| 是否阻塞
  二、管道默認讀寫——阻塞
  a. 管道讀。喝绻麤]有線程進行寫管道操作,讀線程將一直阻塞,直到有線程往里面寫為止
  b. 管道寫:   如果沒有線程進行讀操作,寫線程將一直阻塞,直到有線程讀數(shù)據(jù)為止
  三、設置管道讀寫——不阻塞(O_NONBLOCK)
  a、管道讀:如果沒有線程進行寫管道操作,讀線程將立即返回
  b、 管道寫:如果沒有線程進行讀操作,寫線程將立即返回,返回錯誤碼-1;errno: ENXIO
  示例代碼:獲取vmstat的參數(shù)
  #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;
  /*創(chuàng)建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
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP