問題2.1 略 問題3.1 略 問題3.2  fgetsで1行分ずつ読み込み,strtok関数でトークン区切りをして名前と年齢を読み込んで  構造体に書き込む 問題4.1 freadで構造体を読み込んでprintfで出力すればよい 問題4.2 fwriteを実行するときの引数に注意.要素1つ分のサイズはsizeof(int),  要素の数は配列数なので50*50*50となる 問題4.3 array[i][j][k]の値は i*100+j*10+k番目に書かれているため,その手前までfseekでオフセットを  移動すればよい. 問題5.1 略 問題5.2 (5) copy2_lowio.cは直接ディスクから読み込むため、一度に読み込むサイズCOPYSIZEに処理時間が    比例する.copy2_highio.cはバッファを使うため,一度バッファにまとめて読み込んでから    データに読み込む.そのため処理時間はCOPYSIZEに依存しない. 問題5.3  copy2_highio.cと同様処理時間はCOPYSIZEに依存しないが,処理時間は速くなっている。  これは読み込むファイルのサイズが大きいためと入れる。 問題6.1  アクセス権は st_mode & ~S_IFMTでとれる.  6.4節を参考にしてそれぞれのビットを確認すればアクセス権が求められる. 問題6.2  ファイルタイプは st_mode & S_IFMTでとれる.  ファイルタイプの定数とマッチングさせてファイルタイプがシンボリックリンクかディレクトリであれば  ファイル名の後に適切な記号を付与する。   lstatを実行するときのファイル名に注意すること.ent->d_nameではファイル名しか取れないので  そのファイルが置かれているディレクトリ名も合わせないとファイル情報が得られない. 問題7.1  ディレクトリ~/course/2010へ移動して、  $ ln -s syspro ~/syspro  を実行し,自分の用意したsysproディレクトリのシンボリックリンクを  教員の要求するディレクトリ下に用意すればよい。 問題7.2  ファイル名の最後の人文字が~であったとき,ファイルを消すかどうか聞いてyと答えたら消す.  ファイルを消すときに,問題6.2と同じくファイルの置かれているディレクトリ名も合わせないと  正しいファイルが消去できないので注意すること. 問題7.3  ディレクトリを移動するときもrenameを使う.  新しいファイルパスを生成する必要のあることに注意.  % rmbfile A/B/C と実行されたら最後のCだけ取り出して,~/.Trash/Cというファイルパスにしないといけない. 問題7.4 略 問題8.1  (2) gen_string関数のarray[8]が内部変数なので関数の実行が終了するとともにスタックフレームが    なくなってしまうため、ポインタの差すアドレスに値がなくなってしまう.  (3) array[8]をmallocで動的に確保すれば関数gen_stringの実行が終わった後も配列arrayは残ります.       array[8]を大域変数にする方法はあまりお薦めできません. 問題9.1 (2) 1500000x4+1500000x4+4=12000004 以上の式より 12,000,004バイト(12MB) (3) 内部変数が巨大すぎてスタック領域が(2)の計算結果通り8MB(スタック領域の容量)を    超えてしまっているため. 問題9.2  getchar()で256文字以上の文字列が標準入力から受け取られたときに  変数bufで確保されている領域を超えてしまいバッファオーバーフローが引き起こされる可能性  がある.  この問題が起きないようにするためには,変数iの値が256以上になった時点でwhile文を  抜けるようにすればよい。 問題10.1 略 問題10.2 親プロセスがfor文を回す前にwaitを実行して子プロセスの収量を待機するようにすればよい。 問題10.3  親プロセスが必要な分の子プロセスを生成し,それぞれの子プロセスでfor文を回すようにする。  親プロセスは子プロセスを生成した後に全ての子プロセスが終了するのを待つようにするため waitpidを使って子プロセスの終了を待つ。 問題11.1 (1)では子プロセスでexecvpを使ってプログラムの実行をし,親プロセスで子プロセスを待機するように  すればよい。  (2)では各引数の先頭アドレスをargv[i]の値に入れてやり,各引数の最後の空白部分にナル文字(\0)を  いれてやればよい   問題11.2 標準入力によって実行するプログラムとその引数を切り替えてあげればよい. 問題11.3  略   問題12.1  親プロセスはパイプに値を書き込んだらすぐにwaitします.  子プロセスはパイプの値を受け取り,2乗した値をパイプに書き込みます.  親プロセスはwaitの後にパイプの値を受け取ってその値を出力すれば子プロセスの処理の結果を  正しく表示させることができます. 問題12.2 argsplitを参考に,| によって実行するコマンドを配列に入れるcommandsplit関数を作りましょう.  親プロセスは子プロセスを生成してコマンドを実行し,その終了を待って次の子プロセスを生成して  コマンドを実行します。プロセスの間の標準入力および標準出力の受け渡しは12.6節と図12.7を参考に  してください。 問題13.1 略 問題13.2  transferではロックをかけてからA,Bの値を読み込みA,Bの値を変更して書き込んでからロックを外しましょう.  observeではA,Bの値を読む前にロックをかけて読んだら解除するようにすれば、transferの処理途中の値を  読むことがなく処理ができる。 問題13.3 read用とwrite用のセマフォを用意する。  send側は相手が前の値を読み込んだら書き込むことができる.  receive側は相手が値を書き込んだら値を読み込むことができる.  そこでsend側はwriteのロックがかかっていない時に値を書き込み,書き込んだらreadのロックを外し(receiveが  値を読み込む事ができる),writeのロックをかける(自分が値を上書きできないようにする)。  receive側はreadのロックがかかっていない時に値を読み込み,読み込んだらwriteのロックを外し  (sendが値を書き込めるようになる),readのロックをかける(自分がもう一度読み込みをしないようにする)   問題14.1 省略 問題14.2   このプログラムはサーバと1台のクライアントのみの通信なのでserver_by_socket.cと   client_by_socket.cを参考にしましょう。 ・サーバはクライアントとの接続が切れた後も、次の接続を待つようにするには、     接続が切れた後,acceptをまた実行すればよいので、accept文以降をwhile文に入れてしまい     ましょう。   ・相手がendというメッセージを入力してきたら相手がリタイアで終了としましょう。   ・しりとりになるように、前の入力の最後の文字と、標準入力の最初の文字がマッチするかどうかを    チェックしましょう。しなければ正しい入力が来るまで繰り返します。 問題14.3 このプログラムはサーバと複数台のクライアントとの通信なのでmserver_by_socket.cとclient_by_socket.cを   参考にしましょう。   サーバプログラム chat_server.c サーバはクライアントの入力を受け取ったらそのメッセージを他のクライアントすべてに送信するように     しましょう。そうするとクライアント間でのチャットができます。   クライアントプログラム chat_client.c    クライアントでは標準入力からのユーザ入力と、サーバから送られるメッセージ入力のどちらかを随時受け取り    出力させなければいけません。標準入力とサーバからの入力を受け取るには、selectシステムコールを使います。    selectはソケットからの接続要求・受信要求を監視すると書きましたが、ソケット番号を入れるところで0番を    指定することによって標準入力からの入力を監視することができます。 問題15.1~15.3は非常に素直な問題なので解説は省略します。