気になったこと、まとめ

最近、 "基礎からわかるTCP/IPネットワーク実験プログラミング"という本を読んでいるんですが、 サンプルを読んでて気になったことがいくつかあるのでまとめ。 とりあえずアウトプットのために書いているだけなので、 あしからず。

システムコールの確認

p132、UDPサーバプログラムリストの185行目

if((fp = popen(command, "r")) == NULL) {

見た感じで何をするシステムコールなのかは分かっちゃうわけですが、 使ったことがなかったので、 ふつリナをめくって調べてみました。

popen(3)

#include <stdio.h>

FILE *popen(const char *command, const chr *mode);

popen()は、 プログラムcommandを起動してそれにパイプをつなぎ、 そのパイプを表すstdioストリームを返します。 失敗したらNULLを返します。
・・・
なお、 popen()ではプログラムがシェル経由で実行されるので、 第1引数commandの文字列ではリダイレクトやパイプも使えます(ふつリナより)

リダイレクトやパイプも使えるのか。pipe()とかexec()系のシステムコールを使えば、 似たようなことができそうだけど、 こっちのほうが簡単。

ifで目があっちこっちいく話

ちなみに上のコードでもそうでしたが、 僕はifの条件式の中に文が入っているのは好きじゃありません。 よくあるパターンが

if( (fp = fopen(filename, "r")) != NULL) {

普通、 プログラムは英文同様に左から右に読むものだと思うのですが、 こういった書き方をされると、 上手く言えないのですが、 目が左にいったり右にいったりするような不快感があるんですよ。 まぁ、上のfopenの例は定石みたいなもんなので大丈夫ですが、 もっと複雑なやつとかになってくるとアウトですね・・・。
個人的には、こう書いてほしい。

fp = fopen(filename, "r");
if(fp == NULL) {

といっても、 あちこちのサンプルは前者の書き方をよく使ってるので、 慣れるしかないですね。

基礎からわかるTCP/IP ネットワーク実験プログラミング―Linux/FreeBSD対応

基礎からわかるTCP/IP ネットワーク実験プログラミング―Linux/FreeBSD対応


ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道

ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道