您的位置首页>企业动态>

Linux 多线程同步-命名管道

导读 大家好,我是极客范的本期栏目编辑小友,现在为大家讲解Linux 多线程同步-命名管道问题。命名管道(先进先出)既可用于进程间通信,也可用

音频解说

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解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);

取消链接(先进先出);

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。