問題 ファイルの一覧を出すコマンドって ls しかないんですか。 答え ls は、readdir と stat をしているから遅いんだという話を聞いて、 readdirを使ってファイルの一覧を出力するプログラムをCで書いてみた。 やることは意外と簡単。 1、Cでプログラムを書く $ vi readdir.c #include <stdlib.h> #include <stdio.h> #include <string.h> #include <dirent.h> void main(argc,argv) int argc; char *argv[]; { DIR *dir; struct dirent *dp; char path[512]; if(argc<=1){ strcpy(path,"."); } else{ strcpy(path,argv[1]); } if((dir=ope
概要 ファイル名のリストだけ高速に欲しいみたいな場合に大量にファイルがあるディレクトリでlsを打って返ってこないみたいなのが地味にストレスになったりするので高速に済ませる手段が無いかを調べてみた。 1ディレクトリに100万ファイル程度 計測前にecho 3 > /proc/sys/vm/drop_cachesを都度実行し10回程度計測 計測 ls -l めっちゃ遅い real 0m24.052s user 0m5.668s sys 0m8.071s straceをしてみるとこんな感じ。-lをつけるとメタデータを取りに行くのでこれが遅いらしい。sysが長い % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 44.6
「はてなブログ」に移行しました。 1日1更新……を目指せなくなってきてるブログ。自分の勉強のために作りました。継続は力なり。 今は主にUbuntuとAndroidネタが中心です。 コマンドを、日本語環境でなく英語環境で実行したいとき、LANG=Cと付けて実行してやったりする。 $ dateと$ LANG=C dateのそれぞれの実行結果を見比べると一目瞭然。 しかし、このCってのがよくわからん。英語環境を表すのにはenというのも用意されていて、実際に$ LANG=en dateとやると、やはり英語で表示してくれる。 じゃあ、Cって何なのよ。と思い調べてみた。 それで見つけたのが、次のページのこの記述 http://mailman.linuxchix.org/pipermail/techtalk/2002-November/013691.html 'LANG=C' sets the loca
mmap はファイルとメモリーアドレスのマッピングを行う mmap をしてもファイルデータが物理メモリーへ即ロードされない(レイジー最適化) データが物理メモリーにロードされてるかは MMU(メモリー管理ユニット)が検知してページフォルトを生成する OS カーネルがページフォルトをインターセプトしたら、やっとファイルデータはメモリーにロードされる mmap は Linux でファイルとメモリーのアドレスを紐付けて(マップして)、ファイルをメモリーかのようにアクセスできるようにしてくれる関数です。 基本的な用途としてはメモリーの中身をハードディスクの中にあるファイルにバックアップを高い頻度でとりたい場合ですかね。 もしくはディスク内のファイルを配列・バッファーのように読み込みたいとかです。 まあ必ずしもファイルをマップする用途に限定されるわけじゃないですが、ここはお急がしい読者さんのために分
Linux Daily Topics 2019年10月16日“脱帽です”―9億3,000万ハッシュ/秒でようやく判明したケン・トンプソンのパスワードは…? AT&Tのベル研において、かのケン・トンプソン(Ken Tompson)とデニス・リッチー(Dennis Richie)がUNIXの開発を開始したのが1969年、つまり今年2019年は"UNIX50周年"にあたるアニバーサリーイヤーでもある。その記念すべき年に、現代のハッカーたちが偉大な先駆者に挑んだ5年越しのゲームがゴールを迎えた。 RubyのWebサーバインタフェース「Rack」やテストフレームワーク「Bacon」の開発者として知られるLeah Neukirchenは2014年、BSD 3のソースツリーからパスワードファイル(/etc/password)を入手した。そこにはトンプソンやリッチーのほか、GoogleのCEOを務めたエリ
UNIX でプロセスを一時的にスリープさせるには sleep(3) が使えます。sleep() は引数に秒単位でしか時間を指定できないので、より短い時間を指定したい場合は usleep(3) (マイクロ秒) や nanosleep(2) (ナノ秒) を使うことになります。sleep(), usleep() はライブラリ関数、nanosleep() はシステムコール*1です。 この usleep() や nanosleep() で 1ms 程度の短い時間プロセスを停止したとして、正確にその時間だけ停止させることはできるでしょうか。http://shiroikumo.at.infoseek.co.jp/linux/time/ にあるコードを参考に、実際に動かしてみます。カーネル 2.6.19 x86_64、CentOS 5 で試します。 まず、nanosleep() で 1ms のスリープを行
realtimeとmonotonicという2種類の時刻を同時に保持するためのものである。Linuxにはこの2種類の時刻があることは知っていたが、違いを把握していなかったので調べてみた。 Linux(というかPOSIX)では、clock_gettime(2)システムコールで経過時間を測るための時刻を得ることができる。上記二つの時刻は、それぞれCLOCK_REALTIMEとCLOCK_MONOTONICフラグを指定することで取得できる。Man page of CLOCK_GETTIMEやDifference between CLOCK_REALTIME and CLOCK_MONOTONIC? - Stack Overflow の説明によると、それぞれの時刻には以下の違いがあるようだ。 CLOCK_REALTIME NTP等によってシステムの現在時刻が変更されると、clock_gettimeも
インクルードするだけで使えるNon-movingで正確なGCをC言語用に作りました。 行数がコメントを除いて100行に満たない非常に小さなライブラリです。 GCのアルゴリズムとしてはCheneyのコピーGCを採用しています。 通常のCheneyのコピーGCではメモリ空間のうち半分が無駄になってしまいメモリ効率が悪かったり、 GC発生時にオブジェクトが移動してしまいC言語のようなポインタを直接触れる言語との相性が悪いという欠点がありました。 今回はヒープ全体を二重連結リストとして管理することでそのような問題を解決しています。 ちなみにこれはTreadmill GCのアイデアと同じです。(が、アルゴリズム自体はTreadmill GCではありません。) APIはLinuxのlist.hに非常に近い見た目になっています。 ある構造体をgcで管理したい場合はstruct gc_head型のメンバを
PIE (位置独立実行形式) を作成する 通常、PIC (位置独立コード) は共有ライブラリに用いられますが、Linux 上で最近の GCC, Glibc および GNU Binutils を使うと、実行ファイルも位置独立にすることができます。本記事では PIE (位置独立実行形式) を作成する方法と特徴を紹介します。 PIE の基本 それでは例を見てみましょう。次のようなファイル foo.c があるとします。 #include <stdio.h> void foo() { printf("hello\n"); } int main() { foo(); return 0; } このファイルを -fPIE というオプションをつけてコンパイルし、 -pie というオプションをつけてリンクすれば PIE を作成できます。出来上がったファイルは普通に実行できます。 % gcc -c -fPIE
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く