ファイルを開いてからforkすると、そのファイルディスクリプタはシステムワイドなオープンファイルテーブルの同じ項目を指すので、書き込み位置(file offset)も共有され、同時に追加書き込みをしても競合は発生しないと思ったのですが、実験してみたら log.txt PARENT 24043 894 helloCPARENT 24043 895 hellCHPARENT 24043 896 helCHIPARENT 24043 897 heCHILPARENT 24043 898 hello のようにおかしな部分が出ていました。環境はLinux 3.10.0です。 基礎的なことかと思いますが、どうしてこうなるのか教えていただけないでしょうか。 実験に使ったコード: #include <stdio.h> #include <unistd.h> #include <fcntl.h> #incl
これまで数回にわたって紹介してきたmmap(2)に続き、今度はpipe(2)による処理の高速化について考察していく。やりとりするデータのサイズを工夫することで、うまく効率化を図ることができる(編集部) システムコールの特性を知ろう UNIX系OSにおける基本機能にパイプがある。シェルでは|で表現され、コマンドの標準出力を次のコマンドの標準入力に結びつける処理をする。 実際に使われるシステムコールはpipe(2)で、pipe(2)で生成されたファイルディスクリプタに対してwrite(2)およびread(2)でデータの読み書きを行う仕組みになっている。 これまで数回にわたって、mmap(2)を使うことで処理の高速化が実現できることを示してきたが、read(2)/write(2)を使っても、やりとりするデータのサイズを工夫することで、処理速度の改善を図ることができる。ここではOSの提供するいくつ
「Java BlockingQueueで遊ぶ:パイプラインごっこ」でパイプラインの話をしたので、本来の、つまりUnixのパイプやリダイレクトを少し調べてみました。 たまに話題となる some-command >file 2>&1 と some-command 2>&1 >fileの挙動の違いについて、「シェルはコマンドラインリダイレクトの指定を右から左に解釈実行する」なんて説明が見つかりました。んなバカな! パージングは左から右にするものですよ。パーズツリーを逆順にたどることはできるけど、そんなことする必然性はなんにもないよ。 次の記事を読むと、「右から左」なんて事情じゃないことが分かるでしょう。 UNIXの部屋 検索: リダイレクト シェルのリダイレクトにまつわる失敗 さてここでは、複雑なリダイレクト処理も完全に理解できる処方箋を示しましょう。例えば、次のコマンドラインが何をするか分かる
How do I increase the maximum number of open files under CentOS Linux? How do I open more file descriptors under Linux? The ulimit command provides control over the resources available to the shell and/or to processes started by it, on systems that allow such control. The maximum number of open file descriptors displayed with following command (login as the root user). Command To List Number Of Op
追記 POSIX では明確にソケットの最大値とはうたってはいないものの、Linux の実装を見ても最大値と扱う方が良い様です。また Winsock では select(2) の第一引数は無視されるようです。 C言語でソケットを使うプログラミングを行う際、ソケットディスクリプタがシグナル状態かを調べる方法としてselect(2)があります。 使い方は int r; fd_set rfds; FD_ZERO(&rfds); FD_SET(sock, &rfds); r = select(1, &rfds, NULL, NULL, NULL); といった感じ。ここでselect(2)の第一引数に渡している値は、ディスクリプタ集合rfdsの内、いくつ検証するかを指す値。つまりrfdsに対してFD_ZERO/FD_CLRしてからFD_SETした回数となります。 ちなみに戻り値は、ディスクリプタ集合の
LinuxのようなUNIX系OSでは,ファイルに対する操作と同様にネットワーク通信を行うために,「ソケット」と呼ばれる仕組みを使います。今回はソケットについて学びましょう。 コンピュータは「電子計算機」という和名が示す通り,本来は高速に計算するための機械でした。しかし,現在のコンピュータは,Webブラウジングや電子メールのやり取りなどに使われることが多く,ネットワークと切り離すことができません。最近は「コンピュータを使う」ことと「ネットワークを使うこと」がかなり同義になっているのではないでしょうか。 今回は,ネットワークを介した通信の基礎になっている「ソケット」という概念を紹介します。 ディスクリプタでアクセスが単純に ソケットはネットワーク通信に用いるファイル・ディスクリプタ(file descriptor)です。そこで,ソケットの説明に入る前に,より一般的なファイル・ディスクリプタにつ
みなさんご存知かもしれませんが、*nixではひとりのユーザーが同時にオープンできるファイルディスクリプタの数の上限がきまっていたりします。もっと有り体にいうと、ひとつの*nixプロセスで動作するファイルディスクリプタの上限が制限されてしまうというのが一番の問題。いくらC10Kに耐えられるようなスーパープログラムを書いたところで、こいつの初期値は1024とか256だったりするので「あり?おかしいな?」とかいうのは誰もが通る道だと思います*1。 で、まあやっぱりErlangのはなしになります。ErlangでC10KなTCPサーバー書いたところでこの問題は避けて通れません。そいでsudo ulimit -n 1000000とかやっちゃいますよね。当然です。 とはいえ、そうしたらなぜかしらん、erlコマンド叩いてerts起動しただけでメモリを500MBを食う[要検証]との報告があったので、一体なん
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く