【发布时间】:2013-06-19 21:53:51
【问题描述】:
我正在尝试学习管道,我正在尝试这个程序:
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<sys/types.h>
#include<fcntl.h>
#define MAXLINE 100
void main(){
int pipe1[2],pipe2[2];
pid_t childpid;
if(pipe(pipe1)<0){
perror("Unable to create the pipe for pipe1");
exit(-1);
}
if(pipe(pipe2)<0){
perror("Unable to create the pipe for pipe1");
exit(-1);
}
childpid=fork();
printf("The child PID is:%d\n",childpid);
if(childpid==0){
printf("In the child process");
close(pipe1[1]);
close(pipe2[0]);
server(pipe1[0],pipe2[1]);
exit(0);
}
close(pipe1[0]);
close(pipe2[1]);
client(pipe2[0],pipe1[1]);
waitpid(childpid,NULL,0);
exit(0);
}
void client(int readfd,int writefd){
int n,len;
char buff[MAXLINE];
printf("Please enter the name of the file to be read:");
fgets(buff,MAXLINE,stdin);
len=strlen(buff);
if(buff[len-1]=='\n')
len--;
write(writefd,buff,len);
printf("File name written into the pipe\n");
printf("The num of bytes written are:\n",read(readfd,buff,MAXLINE));
while((n-read(readfd,buff,MAXLINE))>0){
printf("Trying to read the content\n");
write(STDOUT_FILENO,buff,n);
}
}
void server(int readfd,int writefd){
int fd,n;
char buff[MAXLINE + 1];
write(writefd,"Yello in the server process",strlen("Yello in the server process"));
if((n=read(readfd,buff,MAXLINE))==0)
perror("End of file while reading");
buff[n]='\0';
if((fd=fopen(buff,O_RDONLY))<0){
snprintf(buff+n,sizeof(buff)-n,"Can't open, %s",strerror(errno));
n=strlen(buff);
write(writefd,buff,n);
}
while( (n=read(fd,buff,MAXLINE))>0){
write(writefd,buff,n);
close(fd);
}
}
问题是我输入了文件名,程序就退出了。我试图通过设置 set "follow-fork-mode child" 来 gdb 子进程,但仍然没有任何反应。关于我可能出错的地方有什么想法吗?
好的,还有一些额外的调试信息是:我将 follow-fork-mode 设置为 child。它导致文件打开时出现分段错误。
程序收到信号SIGSEGV,分段错误。 【切换到进程28025】 0x00197f08 in _IO_file_fopen() from /lib/libc.so.6
【问题讨论】:
-
首先,您的程序不包含必要的包含,即
#include<stdlib.h>。 -
您复制并粘贴了错误消息,因此如果您未能创建
pipe2,您会想知道为什么pipe1失败。main()的返回类型是int,而不是void。不要忘记用换行符结束消息;在输出换行符之前它们不会出现。 -
@user1295872 你在哪个系统上工作?
标签: c operating-system pipe