1

私は 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;
}
4

1 に答える 1

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末尾をマークします。


C でポインタ例外がNULL発生すると、セグメンテーション違反が発生する可能性があります。ただし、後者は通常、無効なメモリ アドレスにそのままアクセスした場合に発生しますNULL

投棄されていたコアは、死んだ瞬間のプロセスのイメージです。このコア ファイルを使用して、この瞬間にプロセスを検査できます。これを行うには、gdb を使用します。

gbd <program-path/program-file> <core-path/core-file>
于 2013-09-28T15:06:03.350 に答える