大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux 多线程同步-命名管道问题。
命名管道(先进先出)既可用于进程间通信,也可用于线程间通信;先进先出。比较后进先出法。比较FIFO是一种文件类型,一般文件输入-输出函数(关闭、读取、写入、取消链接等)都适用于先进先出。比较后进先出法。比较FIFO
一、管道创建:
#包含系统/统计信息
int mkfifo(const char* pathname,mode _ t mode);
//成功返回0;否则返回-1
//模式为读写文件|是否阻塞
二、管道默认读写——阻塞
a.管道读取:如果没有线程进行写管道操作,读线程将一直阻塞,直到有线程往里面写为止
b.管道写:如果没有线程进行读操作,写线程将一直阻塞,直到有线程读数据为止
三、设置管道读写——不阻塞(0 _非阻塞)
答:管道读:如果没有线程进行写管道操作,读线程将立即返回
b、管道写:如果没有线程进行读操作,写线程将立即返回,返回错误码-1;errno: ENXIO
示例代码:获取vmstat的参数
#包含stdio.h
#包含系统/类型。h
#包含系统/统计信息
#包括errno.h
#包含fcntl.h
#包含stdio.h
#包含stdlib.h
#包含字符串。h
#include assert.h
#包括ctype.h
#定义先进先出myfifo
#定义FILE_PATH 'conf.log '
int ncnt=0;
int get_siso(char* str,int* si,int * so){ 0
assert(str!=空);
字符*子字符串
FILE* fp=fopen(FILE_PATH,' ab ');
sub_str=strtok(str,");
//ncnt=0;
while(sub _ str){ 0
if(sub_str!=NULL是数字(sub _ str[0]){ 0
fprintf(fp,' %s \t ',sub _ str);
printf('substr[%d]=%d \n ',ncnt,atoi(sub _ str));
ncnt
}
if(ncnt==16){ 0
ncnt=0;
}
sub_str=strtok(NULL,' ');
//睡眠(0.3);
}
fc输(FP);
printf('nCnt是%d\n\n\n ',NCNt);
返回1;
}
int MF(){ 0
char buf _ r[1025];
int fd
int nread
printf('准备读取字节.\ n ');
memset(buf_r,0,sizeof(buf _ r));
//系统(' vmstat 2 my FIFO ');
//FD=开(FIFO,O_RDONLY|O_NONBLOCK,0);
fd=开(FIFO,O_RDONLY,0);
if(fd==-1)
{
perror(' open ');
出口(1);
}
而(1)
{
memset(buf_r,0,sizeof(buf _ r));
if((nread=read(fd,buf_r,1024))===-1){ 0
if(errno==EAGAIN)
printf('还没有数据\ n ');
}
睡眠(2);
printf('\n\n%s\n ',buf _ r);
get_siso(buf_r,NULL,NULL);
//睡眠(1);
}
pause();
返回1;
}
void thr _ get(){ 0
pthread _ detach(pthread _ self());
系统(' vmstat 2 my FIFO ');
pthread _ exit(0);
}
void thr _ read(){ 0
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)
{
整数pid
pthread_t cthd,dthd
void * tret
if((mkfifo(FIFO,O _ CREAT | O _ exco)0)(errno!=EEXIST)){ 0
printf('无法创建fifoserver \ n ');
}
系统(' chmod 777 my FIFO ');
int tsts=pthread_create(dthd,NULL,thr_read,NULL);
pthread_join(dthd,tret);
printf('tsts为%d\n ',tsts);
睡眠(60);
取消链接(先进先出);