2012-01-21 6 views
0

私はこれが単なるものであることを知っていますが、まだ私はそれを理解するには眠すぎます。 誰かが私を助けることができますか?Cの睡眠機能

char buf1[] = "one second program started\n"; 
char buf2[] = "one second program end\n"; 

int main(void) 
{ 
write(1,buf1,100); 
sleep(1); 
write(1,buf2,100); 
} 

最初の文が印刷され、次にユニット待機の後に2番目の文が印刷される必要があります。しかし、私がこれを実行すると、両方のステートメントが印刷され、次にユニットが待機し、2番目のステートメントが2回印刷されます。どこが間違っていますか?

+0

可搬性のあるCコードを書くときは、できるだけ読み書きのようなシステムコールから離れるようにしてください。標準ライブラリには、操作するのがはるかに楽しい高水準の関数が豊富に用意されています。 –

+0

恐ろしい!みんな、ありがとう。まあ、私はシステムコールから遠ざかるべきであることを知っています。しかし、この全体のポイントは、Man 2ページからのみシステムコールだけを使用することです。私は100を実際のサイズに変更し、うまくいきました。誰かがアイデアを持っています..どのように私は行の終わりまでファイルから読むことができますか?再びシステムコールのみ。 – madCode

+0

スリーピー?関連性や有用性はどうですか?それでも、安心してからもう一度問題を攻撃するのはどうですか? –

答えて

5

100~strlen(buf1)またはstrlen(buf2)

5

writeは、C文字列を気にせず、指定したバイト数だけ正確に書き込みます(可能な場合)。あなたの場合、それは未定義の動作であるbuf1の終わりを過ぎて読んでいます。

文字列を印刷する場合は、代わりにputsを使用してください。何らかの理由であなたがwriteを使用するを持っている場合

puts(buf1); 

は、サイズ引数として実際の文字列の長さを提供しています。

+0

普通の文字列を印刷する場合は、書式文字列のバグを作成できないため、puts関数が適切です。 printf(buf1)は経験の浅いCプログラマにとって非常に魅力的かもしれません。 (ただし、putsは改行文字を追加することを忘れないでください) –

+0

良い点、ありがとうございます。 – Mat

+0

常に 'printf("%s "、buf1)'があります。 – pezcode