获得“分段故障核心转储”

时间:2013-09-28 15:00:30

标签: c segmentation-fault pipe coredump

我是C的初学者,我必须使用叉子和管道进行锻炼 我必须创建一个父进程来填充一个管道(使用键盘:stdin)和一个子进程,它必须读取管道并将其打印在屏幕上。

但是这段代码的执行给我带来了“分段故障核心转储” 我已经在Java上编程了,这相当于“NullpoinerException”吧? 我正在寻求一些帮助,因为我在2个小时后遇到了这个问题 谢谢

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{

  char* p;
  char* buffer;
  int fd[2];

  pid_t pid = fork();
  pipe(fd);

  //Cas du fils consommateur (Lire dans la pipe, et afficher le contenu a l'ecran ) 
  if (pid == 0)
  {
    close(fd[1]);

    int a;
    do
    {
      a = read(fd[0], buffer, 512);
      //printf("consomateur: %s",  buffer);
    } while (a != 0);

    //Cas du père producteur (remplir la pipe par saisie au clavier)
  }
  else
  {
    close(fd[0]);
    char *adString;

    printf("Enter data \n");
    do
    {
      adString = fgets(buffer, 20, stdin); // on recupere dans un buffer les donneés lues
      write(fd[1], buffer, 512); // on met dans la pipe ce qu'on a mis dans le buffer
    } while (strcmp(adString, "") != 0);

  }

  return 0;
}

1 个答案:

答案 0 :(得分:1)

缺少代码来为指针分配内存:

char* buffer;

例如,这一行:

a = read(fd[0], buffer, 512);

读取随机地址,最可能导致分段违规。


要解决此问题,您可能希望像这样声明buffer

char buffer[512 + 1] = ""; /* Defines buffer to hold 513 bytes and initialise them to 0. */

引用+ 1:为了在C中存储“字符串”,存储“字符串”0 - 终止所需的附加字符,标记“字符串”的结尾。 / p>


如果C中存在NULL指针异常,则可能导致分段错误。然而,后者通常在访问无效的内存地址时发生,因为NULL是。

被倾倒的核心是它死亡时的过程图像。此时您可以使用此核心文件来检查进程。为此,请使用gdb:

gbd <program-path/program-file> <core-path/core-file>