0

コードをビルドするときに問題が発生します。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
    char *input[2];
    input[0]= "ls";
    input[1]= "pwd";
    FILE *result;
    char *output = "output.txt";
    FILE *fout = fopen(output, "w");

    if(!fout){
        fprintf(stderr, "Can not read %s file\n", output);
        return EXIT_FAILURE;
    }

    char command[256];
    pid_t pid = 1;
    int num = 0;
    while(num < 2)
    {
        pid = fork();
        if(pid == 0){
            result = popen(input[num], "r");
            char getline[256];
            while(fgets(getline, 256, result) != NULL){
                fprintf(fout, getline);
                printf("%s", getline);
            }
            printf("\n");
        }
        else if( pid > 0){
            fprintf(fout, "#command %d\n", num);
            printf("#command %d\n", num );
            wait(NULL);
        }
        else{
            printf(stderr, "something wrong in process!");
            break;
        }
        num++;
    }

    if(pid > 0){
        pclose(result);
        fclose(fout);
    }

    return EXIT_SUCCESS;
}

fprintf()隣に置いてみましprintf()たが結果が違います。

コンソールに次のように表示されます。

#command 0
Debug
main.c
output.txt

#command 1
#command 1
/home/lightning/workspace/prac

/home/lightning/workspace/prac

ファイルoutput.txt内:

Debug
main.c
output.txt
#command 1
#command 0
/home/lightning/workspace/prac
Debug
main.c
output.txt
/home/lightning/workspace/prac

誰かが私に説明できますか?

次の出力が欲しいです:

#command 0
Debug
main.c
output.txt
#command 1
/home/lightning/workspace/prac

#commnad NUMは親プロセスから印刷され、の結果は#command NUM子プロセスから印刷されます。

私は何をすべきか?

4

1 に答える 1

2

C でコーディングしてから長い時間が経ちましたが、これを正しく読むと、1 つのテキスト ファイルが開かれ、子プロセス (多かれ少なかれ並行して実行されます) が分岐し、両方のプロセスが独立して非同期に処理されます。そのファイルに書き込み、終了します。

ほとんどの場合、2 つのプロセスが文字単位で相互に書き込んでいます。

いくつかの選択肢があります。

  1. ロジックを再考し、各プロセスが独自のファイルに書き込むようにします
  2. ファイル ロックを使用します。各プロセスにファイルを開いて排他的に書き込みます (良い考えではありません)。
  3. コード内でロックを使用して、親プロセスが書き込みを完了するまで子プロセスを強制的に待機させます (これもお勧めできません)。
于 2012-09-13T16:51:25.770 に答える