命名管道(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);
什么是RISC-V?RISC-V对战Arm:赢、输或平局?
天融信帮助客户快速构建安全私有云,推出超融合私有云产品
各种电机的结构和工作原理
国产手机四小花旦,华为变第二了!
世界首个机器人律师正式上线 称两年内已经打赢无数官司
Linux 多线程同步-命名管道
德国电信将与诺基亚合作部署5G网络
实验性AI将COVID轻度与严重区分开
爆realme新旗舰机的充电器,支持20V 6.25A最高125W超级闪充
利用云存储推动企业数字化转型
带上可转速控制东芝新型IC,做一枚极致灵活的小风扇
有悖《上市公司重大资产重组管理办法》,保变电气放弃收购云变电气
广播系统3种传输方式以及其优缺点分析
以太币价格走势图_以太币最新价格
利用运算放大器OP07实现恒流源阻值检测电路的设计
水动力时钟制作方法
UWB超宽带技术室内定位的潜力股
泰芯TXLink仿真器MCU单片机开发调试工具
工业物联网对消费者的好处
配电线路中跌落式熔断器熔丝熔断的处理