资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

linux管道命令错误 linux中管道命令

Linux下管道通信出错

问题在这个while上

成都网站建设、网站制作,成都做网站公司-创新互联建站已向上千企业提供了,网站设计,网站制作,网络营销等服务!设计与技术结合,多年网站推广经验,合理的价格为您打造企业品质网站。

不是

while( (n = read(fd, buff, MAXLINE) 0 ) )//读取文件里的内容

应该是(注意括号括的地方)

while( (n = read(fd, buff, MAXLINE) ) 0 )//读取文件里的内容

{

/*这个地方出错了,源程序中不包含注释这部分代码

//cout n endl; //这里为什么n都是

//n = strlen(buff); //这里都是MAXLINE

//cout n endl;

//buff[n] = '\0';

*/

Linux管道命令(pipe)

管道命令就是用来连接多条指令的,前一条指令的输出流向会作为后一条指令的操作对象。

管道命令的操作符是:|,它只能处理由前面一条指令传出的正确输出信息,对错误信息是没有直接处理能力的。然后,传递给下一条指令,作为操作对象。

基本格式:

指令1 | 指令2 | …

【指令1】正确输出,作为【指令2】的输入,然后【指令2】的输出作为【指令3】的输入,如果【指令3】有输出,那么输出就会直接显示在屏幕上面了。通过管道之后【指令1】和【指令2】的正确输出是不显示在屏幕上面的。

【提醒注意】

管道命令只能处理前一条指令的正确输出,不能处理错误输出;

管道命令的后一条指令,必须能够接收标准输入流命令才能执行。

使用示例

1、分页显示/etc目录中内容的详细信息

$ ls -l /etc | more

2、将一个字符串输入到一个文件中

$ echo “hello world” | cat hello.txt

求linux大神指点我的管道程序有什么错误?

这里有两点要注意,第一,如果没有读打开管道,那么写打开管道就阻塞,而且不能非阻塞地打开;第二,如果没有写打开管道,那么读打开管道也阻塞,但是可以在open中指定O_NONBLOCK来非阻塞打开。一般读写分别在两个进程中。但在一个进程中也可以分别打开读写,但要先以非阻塞方式打开读。你的代码阻塞在了读打开管道.

根据你的代码,我重新写了一个实现。先将用户输入保存再DATAFILE中,再经过FIFO将数据读取并写入SAVEFILE中

#include stdio.h

#include stdlib.h

#include unistd.h

#include string.h

#include sys/types.h

#include sys/stat.h

#include fcntl.h

#include errno.h

#define FIFO "/tmp/fifo"

#define DATAFILE  "./data_file"

#define SAVEFILE  "./save_file"

static int input_data(const char *filename);

static int process_fifo(const char *filename);

int main(int argc, char *argv[])

{

input_data(DATAFILE);

process_fifo(DATAFILE);

return 0;

}

#define BUFSIZE    1024

static int input_data(const char *filename)

{

printf("input data:\n");

char buf[BUFSIZE];

int n=read(STDIN_FILENO,buf,BUFSIZE);

if(n0){

perror("read from stdin error");

exit(EXIT_FAILURE);

}

int fd=open(filename,O_CREAT|O_TRUNC|O_RDWR,0666);

if(fd0){

perror("create data file error");

exit(EXIT_FAILURE);

}

if(n!=write(fd,buf,n)){

perror("write to data file error");

exit(EXIT_FAILURE);

}

close(fd);

return 0;

}

static int process_fifo(const char *filename)

{

int rfd=open(filename,O_RDONLY);

if(rfd0){

perror("read from data file error");

exit(EXIT_FAILURE);

}

unlink(FIFO);

if(mkfifo(FIFO,0666)!=0){

perror("failed to create FIFO");

exit(EXIT_FAILURE);

}

int fifo_r,fifo_w;

fifo_r=open(FIFO,O_RDONLY|O_NONBLOCK);

fifo_w=open(FIFO,O_WRONLY);

if(fifo_r0||fifo_w0){

perror("open FIFO error");

exit(EXIT_FAILURE);

}

int n;

char buf[BUFSIZE];

/* 从数据文件中读取数据 */

n=read(rfd,buf,BUFSIZE);

if(n0){

perror("read from data file error");

exit(EXIT_FAILURE);

}

/* 写入管道 */

if(n!=write(fifo_w,buf,n)){

perror("write to FIFO error");

exit(EXIT_FAILURE);

}

/* 从管道读取 */

memset(buf,0,BUFSIZE);

n=read(fifo_r,buf,BUFSIZE);

if(n0){

perror("read from FIFO error");

exit(EXIT_FAILURE);

}

/* 打开保存数据的文件 */

int wfd=open(SAVEFILE,O_CREAT|O_TRUNC|O_WRONLY,0666);

if(wfd0){

perror("create save file error");

exit(EXIT_FAILURE);

}

if(n!=write(wfd,buf,n)){

perror("write to FIFO error");

exit(EXIT_FAILURE);

}

/* 结束 */

close(rfd);

close(wfd);

close(fifo_r);

close(fifo_w);

return 0;

}


网站栏目:linux管道命令错误 linux中管道命令
文章转载:http://www.cdkjz.cn/article/dodcjii.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220