linux管道命令错误 linux中管道

Linux下管道通信出错问题在这个while上
不是
while( (n = read(fd, buff, MAXLINE)0 ) )//读取文件里的内容
应该是(注意括号括的地方)
while( (n = read(fd, buff, MAXLINE) ) 0)//读取文件里的内容
{
/*这个地方出错了,源程序中不包含注释这部分代码
//coutnendl;//这里为什么n都是
//n = strlen(buff);//这里都是MAXLINE
//coutnendl;
//buff[n] = '\0';
*/
求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 BUFSIZE1024
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管道命令(pipe)管道命令就是用来连接多条指令的,前一条指令的输出流向会作为后一条指令的操作对象 。
管道命令的操作符是:|,它只能处理由前面一条指令传出的正确输出信息,对错误信息是没有直接处理能力的 。然后,传递给下一条指令,作为操作对象 。

推荐阅读