十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
问题在这个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';
*/
管道命令就是用来连接多条指令的,前一条指令的输出流向会作为后一条指令的操作对象。
管道命令的操作符是:|,它只能处理由前面一条指令传出的正确输出信息,对错误信息是没有直接处理能力的。然后,传递给下一条指令,作为操作对象。
基本格式:
指令1 | 指令2 | …
【指令1】正确输出,作为【指令2】的输入,然后【指令2】的输出作为【指令3】的输入,如果【指令3】有输出,那么输出就会直接显示在屏幕上面了。通过管道之后【指令1】和【指令2】的正确输出是不显示在屏幕上面的。
【提醒注意】
管道命令只能处理前一条指令的正确输出,不能处理错误输出;
管道命令的后一条指令,必须能够接收标准输入流命令才能执行。
使用示例
1、分页显示/etc目录中内容的详细信息
$ ls -l /etc | more
2、将一个字符串输入到一个文件中
$ echo “hello world” | cat hello.txt
这里有两点要注意,第一,如果没有读打开管道,那么写打开管道就阻塞,而且不能非阻塞地打开;第二,如果没有写打开管道,那么读打开管道也阻塞,但是可以在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;
}