当前位置: 游戏平台 > 互联网科技 > 正文

Linux进度间通讯-命名管道深刻通晓

时间:2020-01-09 19:57来源:互联网科技
1:fifo原因 各位铁汉,小叔子演习写了个代码,求解答 何以运转的结果无法出口“”,何况当自个儿在极限输入quit时现身不停打字与印刷“”的死循环 代码如下: 继上篇小说深入分析

1:fifo原因

各位铁汉,小叔子演习写了个代码,求解答
何以运转的结果无法出口“>”,何况当自个儿在极限输入quit时 现身不停打字与印刷“>”的死循环
代码如下:

继上篇小说深入分析了经过间通讯管道的体制和特征,本文将从命名管道(FIFO)介绍进程间通讯。

盛名管道

#include
#include
#include
#include
#include
#include
#include
#include

1、命名管道(FIFO)

文本:安全性,不自动化,数据残缺未有保持;锁的建制

#define MAX 1024
pthread_mutex_t rwlock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t rwcond =PTHREAD_COND_INITIALIZER;
void* read_file(void *arg)
{
int fd;
int ret,n;
char buf[MAX];
if(fd = open arg ,O_CREAT|O_RDONLY,0666) == -1)
{
perror("open fail");
pthread_exit;
}
while{
ret =pthread_mutex_lock(&rwlock);
if
{
perror("pthread_mutex_lock");
close;
pthread_exit;
}
n = read(fd ,buf,sizeof;
if
{
perror("read fail");
close;
pthread_exit;
}
while
{
ret = pthread_cond_wait(&rwcond,&rwlock);
if
{
perror("pthread_cond_wait fail");
close;
pthread_exit;
}

管道应用的一人命关天限定是它没有名字,只符合全体亲情性质的进程之间通讯。命名管道克制了这种约束,FIFO分歧于管道之处在于它提供三个路线名与之提到,以FIFO的公文方式存在于文件系统中。那样,就算与FIFO的创始进度不设有赤子情关系的进度,只要可以访谈该路径,就能够相互通过FIFO相互通讯(能够访谈该路线的经过以至FIFO的创立进程之间),由此,通过FIFO不相关的长河也能调换数据。

PHP开荒网址的时候,登陆,session

 } buf[n] =''; printf("read %d character :%s n",strlen; if(strncmp(buf,"quit",4) == 0) { ret =pthread_mutex_unlock(&rwlock); if { perror("pthread_mutex_unlock fail"); close; pthread_exit; } break; } ret = pthread_mutex_unlock(&rwlock); if { perror("pthread_mutex_unlock fail"); close; pthread_exit; }}close;pthread_exit;

2、创设二个命名管道

2:测试

}
void* write_file(void arg)
{
int fd;
int ret,n;
char buf[MAX];
char buf_bak[MAX];
fd = open((char
)arg,O_CREAT|O_TRUNC|O_WRONLY,0666);
if(fd < 0)
{
perror("open fail");
pthread_exit;
}
while{
ret = pthread_mutex_lock(&rwlock);
if
{
perror("pthread_mutex_lock fail");
close;
pthread_exit;
}
printf;
fgets(buf,strlen,stdin);
//snprintf(buf_bak,sizeof,"%s",buf);
buf[strlen-1] ='';
n = write(fd,buf,sizeof;
if
{
perror("write fail");
close;
pthread_exit;
}
if(strncmp(buf,"quit",4) == 0)
{
ret = pthread_mutex_unlock(&rwlock);
if
{
perror("pthread_mutex_unlock fail");
close;
pthread_exit;
}
ret = pthread_cond_signal(&rwcond);
if
{
perror("pthread_cond_signal fail");
close;
pthread_exit;
}
usleep;
break;
}
ret = pthread_mutex_unlock(&rwlock);
if
{
perror("pthread_mutex_unlock fail");
close;
pthread_exit;
}
ret =pthread_cond_signal(&rwcond);
if
{
perror("pthread_cond_signal fail");
close;
pthread_exit;
}
usleep;
}
close;
pthread_exit;
}

#include <sys/types.h>
#include <sys/stat.h>

mkfifo

int main (int argc,char *argv[])
{
pthread_t rpth_id,wpth_id;
int ret;
if(argc < 2)
{
fprintf(stderr,"usage: %s argv[1]n",argv[0]);
exit(EXIT_FAILURE);
}
ret = pthread_create(&rpth_id,NULL,read_file,argv[1]);
if
{
perror("prhread_create fail");

int mkfifo(const char *pathname, mode_t mode);

\192.168.0.155nccfifo_write.c

exit(EXIT_FAILURE);
}
usleep;
ret = pthread_create(&wpth_id,NULL,write_file,argv[1]);
if
{
perror("pthread_create fail");
exit(EXIT_FAILURE);
}

3、操作命名管道

\192.168.0.155nccfifo_read.c

pthread_join(rpth_id,NULL);pthread_join(wpth_id,NULL);return 0;

FIFO在文件系统中表现为一个文本,大部分的系统文件调用都能够用在FIFO上边,例如:read,open,write,close,unlink,stat等函数。可是seek等函数不可能对FIFO调用。

其中:

}

能够调用open函数展开命名管道,可是有两点要静心
1)不能以O_HighlanderDWENCORE方式张开命名管道FIFO文件,不然其行事是未定义的,管道是单向的,无法同期读写;
2)正是传递给open调用的是FIFO的路线名,并不是常规的文本

fifo_write.c

打开FIFO文件经常有多样方法:
open(pathname, O_GL450DONLY卡塔尔(قطر‎;           //1只读、窒碍格局
open(pathname, O_RDONLY | O_NONBLOCKState of Qatar;    //2只读、非窒碍模式
open(pathname, O_WRONLY卡塔尔;          //3只写、窒碍情势
open(pathname, O_WRONLY | O_NONBLOCK卡塔尔(قطر‎;   //只写、非梗塞情势

#include#include#include#include#include#include#include// 打字与印刷错误函数void print_system_err(char *str,int err_no){perror;exit;}int main(int argc, char* argv[]){intfd;charbuf[1024]="niexiaoqian ok";if(argc <2){printf("丢失fifon");exit;}fd=open(argv[1],O_WRONLYState of Qatar;//只写格局if{print_system_err("open failed",1卡塔尔;}// 往管道里面写write(fd,buf,strlen;close;return0;}

介怀窒碍方式open打开FIFO:
1卡塔尔国当以堵塞、只读格局张开FIFO文件时,将会阻塞,直到别的进程以写方式展开访谈文件;
2卡塔尔(قطر‎当以拥塞、只写情势张开FIFO文件时,将会窒碍,直到其余进度以读形式展开文件;
3State of Qatar当以非窒碍情势(内定O_NONBLOCK)情势只读张开FIFO的时候,则即刻回到。当只写open时,若无经过为读张开FIFO,则赶回-1,其errno是ENXIO。

fifo_read.c

 4、拥塞式命名管道

#include#include#include#include#include#include#include// 打字与印刷错误函数void print_system_err(char *str,int err_no){perror;exit;}int main(int argc, char* argv[]){intlength;intfd;charbuf[1024];if(argc <2){printf("丢失fifon");exit;}fd=open(argv[1],O_凯雷德DONLY卡塔尔;//只读格局if{print_system_err("open failed",1卡塔尔;}// 从管道里面读length=read(fd,buf,sizeof;// 打字与印刷到正规输出write(STDOUT_FILENO,buf,length);close;return0;}

Read进度代码如下:

测验效果

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

编辑:互联网科技 本文来源:Linux进度间通讯-命名管道深刻通晓

关键词:

  • 上一篇:没有了
  • 下一篇:没有了