0

このコマンドを実行するプログラムを書きたい:

gcc -c file1 file2 file3 ...

プログラムは子プロセスを作成する必要があり、すべての子は 1 つのファイルをコンパイルします。子プロセスでこのコマンドを使用しました:

execlp("gcc","gcc","-c","-Wall",argv[i],NULL);

ここまでは順調ですね。問題は、ファイルのコンパイル時にエラーが発生した場合、親プロセスがエラーのあるファイルの名前を出力する必要があることです。ファイル名を出力する親が条件です。

私の解決策は、子 pid とそれがコンパイルするファイル名を含むテーブルを作成することです。親は子が終了するのを待ちます。child の最後で、子が正常に終了したかどうかを調べます (0 が返されました)。そうでない場合は、テーブルを検索して、彼の pid を使用して処理されたファイル名を見つけます。

別の解決策を探しています。ファイル名を親プロセスに送信する方法があるかどうかはわかりません。もちろん、そのファイルにエラーがある場合にのみ行います。

ありがとう。

4

1 に答える 1

0

タスク キューを作成する必要があるようです。つまり、何らかのタスクを実行するためにワーカー スレッドを作成してから終了します。その場合、そのアプローチについてはこちらで説明しています

しかし、あなたの本当の質問は、スレッド間でデータをやり取りすることです。関数CreateThreadLPVOID lpParameterには、まさにそのような機能のために含まれているパラメーターが含まれています。これは void * であるため、配列へのポインター、構造体へのポインターなど、任意の変数型を受け入れます。これにより、必要なだけデータをやり取りできます。

以下のコード スニペットは、ポインタをデータの配列に渡します。これはあなたにとって興味深い部分になります

ここにスレッドを作成するセクションがあります

    hThreadArray[i] = CreateThread( 
        NULL,                   // default security attributes
        0,                      // use default stack size  
        MyThreadFunction,       // thread function name
        pDataArray[i],          // argument to thread function 
        0,                      // use default creation flags 
        &dwThreadIdArray[i]);   // returns the thread identifier 

MyThreadFunctionデータを送受信 するワーカー関数を探します。

完全なビルド可能なコードは次のとおりです

posix の場合:

pthread_create()渡せるデータも含まれます:
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); invoid *arg
引数は、Windows バージョンと同様に、最後の引数を使用してスレッドに渡すことができます。また、やりたいことのために機能するのはpthread_join()、プロトタイプ化された関数です。
int pthread_join(pthread_t th, void **thread_return);
この関数は、呼び出されたスレッドの終了時にハンドラーとして使用されます(最初の引数スレッドハンドル)。スレッドが終了すると、pthread_join の最後の引数がデータを受け取ることができます。このデータは、指定された目的に役立つ場合があります。

于 2013-10-26T18:22:08.493 に答える