命名管道(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ù)為止
三、設(shè)置管道讀寫——不阻塞(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);
評論
查看更多