0

私は少し奇妙なことをしていますが、完全に同期させたいです。だから私はあなたの助けを求めることを考えました。私は次のものを持っています:

printf("My name is:");
system("echo syntax_Error");
printf("I am 17 yrs old\n");

これはエコーではなく非常に抽象的です。出力を提供するソフトウェアを実行しているため、実行時間は予測できませんが、順序は同じです。printf、システムコール、printfの順に並べて、そのように配置したい

私の名前はsyntax_Errorです。私は17歳です\n

私はこの注文をロックなしで試しましたが、うまくいきませんでした。これは非常に明白です。または、うまくいく場合は予測できません。私は同期構造に不慣れなので、あなたの意見をお願いします。

乾杯!=)

4

3 に答える 3

2

fflush(stdout)最初のprintf呼び出しの後で、出力バッファーを明示的にフラッシュする必要がある場合があります。このsystem呼び出しにより、独自のバッファリングを持つ新しいプロセスが生成されます。最終的に、このプロセスは終了してそのバッファをフラッシュしますが、親プロセスのバッファは完全に無関係です。

ほとんどのlibc実装は、改行文字が出現するたびに自動的にフラッシュされるためfflush、最初のメッセージの最後に改行文字がある場合は、呼び出しは不要であることに注意してください。

于 2011-02-10T14:55:31.383 に答える
2

Cでのスレッド化と相互排除(同期)について考えている場合は、POSIXスレッドを調べてください。(man pthread)。

他の人があなたの文字列を正しい順序でフラッシュするように言っているように、stdoutをフラッシュします。-n(改行なし)をサポートする「echo」を備えたOSを使用している場合、これは目的の動作を実行します。

#include <stdio.h>

int main(int argc, char *argv[]) {

printf("My name is:");
fflush(stdout);
system("/bin/echo -n syntax_Error");
printf("I am 17 yrs old\n");
fflush(stdout);

}

$ cc     main.c   -o main
$ ./main
My name is:syntax_ErrorI am 17 yrs old

「system」を使用するだけでなく、「execve」なども参照してください。「manexecve」

于 2011-02-10T15:06:42.140 に答える
0

同期オブジェクトを使用したい場合は、そのsystem呼び出しで同期オブジェクトも使用する方法を見つける必要があります。それはおそらく、を使用するのではなく、別のプログラムを作成することを意味しechoます。ちょっと散らかっています。

おそらく、それを処理するためのより賢い方法は、コンソール出力にすべて同じ方法(すべてのsystem呼び出しまたはすべてprintf)を使用するか、コンソールの代わりにログファイルに出力するためにそれらの1つを選択することです。

于 2011-02-10T14:57:46.010 に答える