2017-04-25 5 views
0

の後にプログラムを実行すると、私はmain関数forkで2つのプロセスを作成します。子プロセスは何かを行い、親プロセスは再びforkされ、子プロセスは別の関数を呼び出します。両方の関数は1つのファイルに書き込み、すべて正常に動作します。 私が必要とするのは、両方の関数とすべてのプロセス(両方の関数がプロセスを作成する)の後に、ファイルの最後に何かを書くことです。 私はfprintfコマンドをメインのどこにでも書き込もうとしましたが、それは常にファイルの途中に書き込むので、メインは2つの関数と並行して実行されると思います。 私はセマフォーを使用しようとしました s = sem_open(s1, o_CREATE, 0666, 0); このようにして、各関数の最後にはsem_post(s)を書きました。メインにはsem_wait(s); sem_wait(s);と書いてありましたが、fprintfコマンドを書いても動作しませんでした。 これを解決する方法はありますか? ありがとう私のプログラムで "fork部分"

+0

'fork'は*並列処理ではありません* - これは誤った用語です。 – t0mm13b

答えて

1

私はあなたがwait機能を探していると思います。 this stack overflow questionwait(NULL)を参照してくださいすべての子どもたちが終了するのを待ちます子プロセスが完了するのを待っています(ジョナサン・レフラーに感謝します)。ループ内でwaitを呼び出すと、すべての子プロセスが終了するまで待機します。親プロセスのファイルに書き込む直前にその関数を使用してください。

すべてのプロセスではなく特定のプロセスを待つ場合は、waitpid関数についても読むことができます。

編集: また、実際にはプロセス全体でセマフォを使用できますが、もう少し作業が必要です。 this stack overflow answerを参照してください。基本的な考え方は、関数sem_openO_CREAT定数で使用することです。 sem_open man pageから

sem_t *sem_open(const char *name, int oflag);

sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);

:あなたの親プロセスで

If O_CREAT is specified in oflag, then two additional arguments must 
    be supplied. The mode argument specifies the permissions to be 
    placed on the new semaphore, as for open(2). (Symbolic definitions 
    for the permissions bits can be obtained by including <sys/stat.h>.) 
    The permissions settings are masked against the process umask. Both 
    read and write permission should be granted to each class of user 
    that will access the semaphore. The value argument specifies the 
    initial value for the new semaphore. If O_CREAT is specified, and a 
    semaphore with the given name already exists, then mode and value are 
    ignored. 

、モードおよび値パラメータを持つsem_openを呼び出す与えるsem_openは2つの関数のシグネチャを持っていますそれは必要な権限です。子プロセスでは、そのセマフォを開いて使用するためにsem_open("YOUR_SEMAPHORE_NAME", 0)を呼び出します。

+0

リンクをダンピングするのではなく、それぞれの回答の概要を簡単に説明するのに役立ちます。 – t0mm13b

+0

ありがとう、ありがとう。 – mgarey

+0

私は確信していませんが、私はあなたが書いたとおりに正確に持っていると思います。私はそれが好きだ: main: sem_t * s; s = sem_open(s1、O_CREAT、0666,0); sem_close(s); s = sem_open(s1、O_RDWR); 関数1と2: sem_t * s; s = sem_open(s1、O_RDWR); "s1"はマクロです。 – Erik

関連する問題