user-0 提问: Linux C 段错误（核心已转储）

回复:
user: user-1
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-0
content: #include<stdio.h> //写端 #include<signal.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<string.h> #include<errno.h>  #define MYFIFO  "/tmp/myfifo"   //有名管道文件名 #define SIZE 1024   //缓冲区大小  int main() {     int fd1; //写端文件描述符~     char str[SIZE];     //缓冲区     FILE *fp = NULL;     int len;     char name[20];    //拷贝文件名      printf("in(copy like ./*.txt)>");     fgets(name, 20, stdin); //if((len = strlen(name)) < 20-1)	name[len-1] = '\0'; //remove '\n'     name[strlen(name)-1]='\0';     printf("Confirm the name of the file:%s\n",name);      //以只读方式打开需要拷贝的文件“file”     if((fp = fopen(name,"r")) == NULL){		//         printf("file is not exist");         exit(1);     }      if((mkfifo(MYFIFO, 0666)) == -1) //创建管道，权限rw 	    printf("mkfifo error\n");     else 	    printf("mkfifo success\n");       fd1 = open(MYFIFO,O_WRONLY);    //以只写阻塞方式打开FIFO管道  //	if(fd1 == -1){ //	printf("open fifo error\n"); //	exit(1); //	}      while(fgets(str, 1024, fp) != NULL){         write(fd1, str, strlen(str));   //写入管道         printf("copy: %s",str);     }      close(fd1);     fp = NULL;     fclose(fp);     unlink(MYFIFO); //删除MYFIFO     return 0; } //读端 //读端 #include<stdio.h> #include<signal.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<string.h> #include<errno.h>   #define MYFIFO  "/tmp/myfifo"   //有名管道文件名 #define SIZE 1024   //缓冲区大小   int main() {     int fd0;    //管道     int file;        char name[20];//粘贴文件     char str[SIZE]; //缓冲区      //判断有名管道是否已经存在，若尚未创建，则以相应的权限创建     if(access(MYFIFO, F_OK) == -1)     {         if((mkfifo(MYFIFO, 0666) < 0) && (errno != EEXIST))         {             printf("Cannot create fifo file!\n");             exit(1);         }     }     //fd0 = open(MYFIFO,O_RDONLY);        //以只读阻塞方式打开有名管道     if((fd0 = open(MYFIFO,O_RDONLY)) == -1)     {         printf("Open fifo file error!\n");         exit(1);     }      printf("in(paste like ./*.txt)>");     fgets(name, 20, stdin);      //创建粘贴文件     //file = open(name, O_CREAT|O_WRONLY);     if((file = open(name, O_CREAT|O_WRONLY)) < 0){         printf("Open paste file error!\n");         exit(1);     }      memset(str, 0, SIZE);   //清空刚创建的粘贴文件     //写入     while(read(fd0, str, SIZE) > 0){         printf("paste: %s", str);         write(file, str, strlen(str));     }      close(file);     close(fd0);     return 0; }

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:注意1：fgets使用时，若输入的字符小于20 - 1个字符，即小于19个字符时，会将'\n'加入到name中。 注意2：fopen的返回值是NULL或非NULL，若为NULL则表示打开失败，否则位打开成功。因此不是和0比较大小； 注意3：注意判断fd1的值，确保管道是打开成功，否则应退出程序  你好，我把fges和fopen的错都改正了，在打开管道部分也正常能打开。配合我写的读端出现的错误在mkfifo(MYFIFO,0666)，这里报错了，我把fifo的路径也改成"/tmp/myfifo",卡在这后运行读端并在读端创建成功管道，能读到，但写端还是提示段错误

user: user-2
content: #include<stdio.h> #include<signal.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<string.h> #include<errno.h>  #define MYFIFO  "/myfifo"   //有名管道文件名  #define SIZE 128   //缓冲区大小  int main() {     int fd1; //写端文件描述符~     char str[SIZE];     //缓冲区     FILE *fp;      char name[20];    //拷贝文件名     printf("in(copy like ./*.txt)>");     fgets(name, 20, stdin);      if ((len = strlen[name]) < 20 - 1)     	name[len] = 0;    //remove '\n'      //以只读方式打开需要拷贝的文件“file”     if((fp = fopen(name,"r")) == NULL){         printf("file is not exist");         //printf("%c is not exist",file);         exit(1);     }     mkfifo(MYFIFO, 0666);   //创建管道，权限rw     fd1 = open(MYFIFO,O_WRONLY);    //以只写阻塞方式打开FIFO管道     while(fgets(str, 1024, fp) != NULL){         write(fd1, str, strlen(str));   //写入管道         printf("copy: %s",str);     }     close(fd1);     fclose(fp);     unlink(MYFIFO); //删除MYFIFO     return 0; }  注意1：fgets使用时，若输入的字符小于20 - 1个字符，即小于19个字符时，会将'\n'加入到name中。 注意2：fopen的返回值是NULL或非NULL，若为NULL则表示打开失败，否则位打开成功。因此不是和0比较大小； 注意3：注意判断fd1的值，确保管道是打开成功，否则应退出程序

user: user-3
content: 打开文件是失败的，在if语句上面加上这条语句试下  name[strlen(name)-1]='\0';

user: user-4
content: GDB -rdynamic 调试的结果是 Program received signal SIGSEGV, Segmentation fault. _IO_fgets (buf=0x7fffffffdca0 "", n=1024, fp=0x0) at iofgets.c:47                                                                        ^^^^^^^^ 47	iofgets.c: 没有那个文件或目录.  注意，fp是0。检查下前面文件真的open成功了吗