0

システムコール fork() を使用して子プロセスを作成し、次に孫を作成し、子と孫の間にパイプを作成するプログラムを作成しています。私の実装はかなり良いと思いますが、プログラムを実行すると、コード内のプロンプトが単純にスキップされます。

基本的に、次のようになります。

-プロセス開始
Fork() create child
Child はパイプを作成します
Fork() は孫を作成し、パイプは継承されます。

TL;DR- コードが UI プロンプトをスキップします。データを正しく入力しているかどうか、データをプロセスに正しく読み込んでいるかどうかがわかりません。

パイプを介して入力を読み取るにはどうすればよいですか?

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

void main(int argc, char *argv[])
{
        int p[2];
        int pid, pid2;

        pid = fork();

        if(pid == 0)
        {
                pipe(p);
                pid2 = fork();

                switch(pid2)
                {
                        case -1:
                                printf("CASE 1");
                                exit(-1);
                        case 0:
                                close(0);
                                dup(p[0]);
                                close(p[0]);
                                close(p[1]);
                                execl("./Sort/sort", 0);
                                break;
                        default:
                                close(1);
                                dup(p[1]);
                                close(p[1]);
                                close(p[0]);
                                execl("./Pre/pre", 0);
                                break;
                }
          }
          else
          {
                wait(pid);
                printf("Process Completed\n");
                exit(0);
           }
}

前の子プロセス:

#include <stdio.h>

void main (int argc, char *argv[])
{
        char n1[20];
        int g1;
        FILE *ofp, *ifp;
        int track;

        ofp = fopen("output.txt", "w");

        while(track != -1)
        {
                printf("Please enter the student's grade and then name, ");
                printf("separated by a space: ");
                scanf("%3d %s", &g1, n1);

                if (g1 >= 60)
                {
                        fprintf(ofp, "%s\n", n1);
                }

                printf("Add another name?(-1 to quit, 0 to continue): ");
                scanf("%d", &track);
        }
        fclose(ofp);

        ifp = fopen("output.txt", "r");
        printf("Students that made a 60+:\n");
        while(fscanf(ifp, "%s", n1) == 1)
                printf("%s\n", n1);

        fclose(ifp);

ソートの子プロセス:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int stringcmp(const void *a, const void *b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(*ia, *ib);
}

void main(int argc, char *argv[])
{
     int i = 0;
     int num = 0;
     int j = 0;
     char name[20];

          printf("How many names would you like to enter? ");
          scanf("%d", &num);

          char **input = malloc(num * sizeof(char*));

          for (i=0; i < num; i++)
          {
                printf("Please input a name(first only): ");
                scanf("%s", name);
                input[i] = strdup(name);
          }

          qsort(input, num, sizeof(char *), stringcmp);

          printf("Names:\n");

          for(j = 0; j < num; j++)
               printf("%s\n", input[j]);


          for( i = 0; i < num; i++ ) free(input[i]);
          free(input);
4

2 に答える 2

1

pre プロンプトが stdout に出力されることを確認します。そのテキストはパイプに行き着き、パイプはsort'sに行き着きstdinます。

fprintfすべてのプロンプトを にする必要がありますstderr

preまた、が期待する形式でテキストを出力しませんsortsort整数のn後にn単語 (ファースト ネーム) が続くことを期待します。したがって、それがon に出力される唯一のテキストである必要があります。それ以外はすべてファイルまたは.prestdoutstderr

PSまた、dup2(p[0], 0)代わりに使用close(0); dup(p[0])すると、意図が明確になり、スレッドの問題を回避できる可能性があります(もちろん、スレッドがある場合にのみ関連しますが、覚えておく価値があります)。

于 2012-09-21T06:30:53.847 に答える
0

これがそれを行う方法の2つの例です

  1. http://www.gnu.org/software/libc/manual/html_node/Creating-a-Pipe.html
  2. http://tldp.org/LDP/lpg/node11.html

編集:「。/ Pre /pre」の出力を「./Sort/sort」の入力にパイプしようとしていることはわかりますが、「コードがUIプロンプトをスキップする」とはどういう意味かわかりません。のために、プロンプトはcase 1:ありdefault:ません。正確には何が問題ですか?より具体的なものが必要な場合は、質問の詳細を詳しく説明してください。

于 2012-09-21T05:53:03.697 に答える