-1

システムコールを使用せずに匿名パイプを実装しようとしています: pipe(), fork(), mkfifo(), open(), read(), write(), close() 。

基本的に、2 つのファイル記述子 (どちらも共有メモリ ID を持つ) がリーダー用に、もう 1 つはライター用に、2 つのセマフォを介して通信する共有メモリを使用して匿名パイプを実装しました。フォークのケース。

私の質問は、フォーク呼び出しをどのように実装するか、またはこの状況をどのように処理するかです。

pthread_atfork() および atexit() システムコールの使用が許可されています。

どうもありがとう。

ps

私の実装がどのように機能するかを正確に強調するために、パイプの通常の短いコードを添付しています。

コードは動作します!!! 私の関数がどのように機能するかを説明するためだけにあるのです。

    #include<unistd.h>
    #include <stdio.h>

    int main()
    {
      int pfd[2], rb;
      char buff[100]; 
 //I implemented this syscall by allocating shared memory
      if (pipe(pfd)<0)
      {
        return -1;
      }
    //here is my problem. I don’t know how to treat this syscall     
     if (fork())
      {

        sleep(5);
    //I implemented this syscall by two file descriptors which communicate via two 
    //semaphores
        write(pfd[1], "hello world\n", sizeof("hello world\n"));
        wait(NULL);
      }
      else
      {
    //I implemented this syscall by two file descriptors which communicate via two 
    //semaphores

        rb = read(pfd[0], buff, sizeof(buff));
        if (rb < 0)
          perror("SON: read");
        else
        {
          printf("SON: writing %d\n", rb);
          write(1, buff, rb);
        }
      }

      return 0;
    }

心から、

エリ

4

1 に答える 1

0

fork匿名パイプを実装する必要はありませんが、テストする必要があるかもしれません。従来の Unix プラットフォームを使用している場合fork、新しいプロセスを作成するほとんどの方法にはforksyscall が含まれます。あなたの選択肢は次のとおりです。

  • vforkexecプログラムを見つけて適切な引数を提供できると仮定すると、すぐに が続きます。
  • プログラムの別のコピーを外部から呼び出す。また
  • ねじ切り ( pthread_create)。
于 2012-07-04T12:08:50.823 に答える