Linux多線程同步之命名管道 |
發(fā)布時(shí)間: 2012/8/10 10:26:57 |
命名管道(FIFO)既可用于進(jìn)程間通信,也可用于線程間通信;
FIFO是一種文件類型,一般文件I/O函數(shù)(close,read,write,unlink等)都適用于FIFO 一、管道創(chuàng)建: #include int mkfifo( const char* pathname, mode_t mode ); //成功返回0;否則返回-1 //mode為讀寫文件| 是否阻塞 二、管道默認(rèn)讀寫——阻塞 a. 管道讀。喝绻麤]有線程進(jìn)行寫管道操作,讀線程將一直阻塞,直到有線程往里面寫為止 b. 管道寫: 如果沒有線程進(jìn)行讀操作,寫線程將一直阻塞,直到有線程讀數(shù)據(jù)為止 三、設(shè)置管道讀寫——不阻塞(O_NONBLOCK) a、管道讀:如果沒有線程進(jìn)行寫管道操作,讀線程將立即返回 b、 管道寫:如果沒有線程進(jìn)行讀操作,寫線程將立即返回,返回錯(cuò)誤碼-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 %dnnn", 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 yetn"); } sleep(2); printf("nn%sn",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 fifoservern"); } system( "chmod 777 myfifo" ); int tsts = pthread_create( &dthd, NULL, thr_read, NULL ); pthread_join( dthd, &tret ); printf( "tsts is %dn", tsts ); sleep( 60 ); unlink(FIFO); } 本文出自:億恩科技【1tcdy.com】 服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |