c - 在 C 中使用命名管道读取和写入同一个文件
问题描述
更具体地说,该程序应该模拟 bash 命令cat file| grep $keyword > file
。我所做的是:在父文件中,我从文件中读取每个字符并将它们格式化为行,然后发送到命名管道,然后在子文件中将包含关键字的行写入原始文件。
但是,我在尝试从原始文件中读取第二个字符时收到分段错误错误,我认为这是因为父级正在等待子级写入原始文件而不是读取所述文件的内容。
任何有关执行/解释为什么会发生错误的帮助都会很棒。
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
char key[20], *c,line[40];
int fd,fd_r,fd_w,fd_fr,fd_fw,counter=0;
int main(){
pid_t pid;
mkfifo("fifo1",0777);
fgets(key,10,stdin);
int k=0;
if ((pid=fork()) < 0)
perror("err_fork");
if(pid){ //PARENT
printf("%d\n",fd_r=open("prog.c",O_RDONLY));
printf("%d\n",fd_fw=open("fifo1",O_WRONLY));
while(read(fd_r,c,1)){
line[k++]=(*c);
while(read(fd_r,c,1) && ((*c)!='\n'))
line[k++]=(*c);
line[k]=0;
write(fd_fw,line,strlen(line)+1);
memset(line,0,sizeof(line));
}
close(fd_r);
close(fd_fw);
}
else{ //CHILD
printf("%d\n",fd_w=open("prog.c",O_WRONLY));
printf("%d\n",fd_fr=open("fifo1",O_RDONLY));
while(read(fd_fr,line,sizeof(line))){
c=strstr(line,key);
if(c)
write(fd_w,line,strlen(line)+1);
}
close(fd_w);
close(fd_fr);
}
unlink("fifo1");
}
解决方案
您正在发生段错误,因为您试图将一个字节读入c
. 但是,c
是一个未初始化的全局指针,因此它等于NULL
. 因此,尝试在该位置读取数据是对内存的无效使用。
相反,您要做的是声明
char c;
接着
read(fd_r,&c,1)
推荐阅读
- javascript - Angular - 加载时出现图像
- python - ValueError: 层 lstm_17 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=2。收到的完整形状:[无,128]
- amazon-web-services - AWS CodeCommit 在成功构建之前阻止合并
- python - 如何将二维数组作为 multiprocessing.Array 传递给 multiprocessing.Pool?
- vbscript - 如何在 VBS 中使用默认值参数定义函数
- python - 从数据框中提取高低数据
- javascript - 如何在javascript中根据日期修改对象数组
- kubernetes - Kubernetes 水平 pod 自动缩放是一种被动方法还是主动方法?
- python - Flask WTForms:至少一个字段的验证 InputRequired
- vba - 替换不同工作表中的值