タグ

Linuxとcに関するtyruのブックマーク (24)

  • Linux KernelのLinked Listの実装が面白い件 - 愛と勇気と缶ビール

    最近、Robert Love先生のを暇な時にダラーと読んでいたりするわけですが、それの中にLinux Kernel内部で使われているLinked Listの実装が書いてあって面白かったので共有。 まず、Linked Listの一個一個のエントリを表すstructを定義します。 struct list_head { struct list_head *next, *prev; }; いやいやいやいや。いかにC力の低い僕でも流石にこれはあきません。騙されませんよ。前後のエントリへのポインタは確かにあるけれども、これにはデータを指すためのポインタがないじゃないの。おじいちゃんまたデータ忘れてきちゃったの?いやあねえ。 おじいちゃんは言った。「それはお前の短見というものじゃ。このLinked Listは以下のコードのようにデータ構造に埋め込んで使うものなんじゃよ。」そしてそれは正しかった。 st

    Linux KernelのLinked Listの実装が面白い件 - 愛と勇気と缶ビール
    tyru
    tyru 2012/12/12
    なるほど。すげー
  • /dev/keikyuで "ダァ!!シエリイェッス!!" - Shohei Yoshida's Diary

    Linuxデバイスドライバを書く練習。/dev/fizzbuzzにしようかと思ったけど、 なんかあれだったので。まあ中身は fizzbuzzなんですが・・・。 ソース C言語をスクラッチから書くのは慣れない・・・. #include <linux/init.h> #include <linux/module.h> #include <linux/types.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/device.h> #include <asm/uaccess.h> #include <asm/string.h> MODULE_LICENSE("Dual BSD/GPL"); static int keikyu_open(struct inode *i

    /dev/keikyuで "ダァ!!シエリイェッス!!" - Shohei Yoshida's Diary
    tyru
    tyru 2011/11/08
    ダァ!!
  • C言語: UNIX最速ファイルコピー

    Created: Kazuki Ohta, 2006/06/14 Last Update: Kazuki Ohta, 2006/06/14 「write(2)の正しい使い方」と同じく、OS演習でやった事の延長線の記事を書いてみる。お題は「UNIX上で大規模ファイルを最速でコピーする方法」だ。一般的に、UNIXでファイルをcopyする際には以下のような方法が有る。 read -> write read -> write with posix_fadvice mmap -> mmap -> memcpy -> fsync mmap -> mmap -> memcpy -> fsync with madvise mmap -> write mmap -> write with madvise read, write, mmap辺りは良いとして、posix_fadviseというシステムコールが有

  • close()

    プププランドのプリンス RiSK @sscrisk 何が問題なのかよく分からない。何をいいたいんだろう? "Story of Your Life » Blog Archive » fstreamのデストラクタを追ってみた話" http://shnya.jp/blog/?p=271 プププランドのプリンス RiSK @sscrisk "仕事でも使えるようなというレベルのことを考えると、間違いなくクローズする関数の戻り値をチェックすべきです。" というこの主張がどうなんだろう?

    close()
  • ディレクトリを fopen の "r" で開く - higepon blog

    「ディレクトリを fopen の "r" で開く」事が成功する前提のコードを見かけた。 Unix 系だとたまたま動くという理解で良いんだよね? コード if ((ffp = fopen(fn, "r")) == NULL) { if (errno == ENOENT) return (FIOFNF); return (FIOERR); } /* If 'fn' is a directory open it with dired. */ if (fisdir(fn) == TRUE) return (FIODIR);

    ディレクトリを fopen の "r" で開く - higepon blog
  • memologue - UNIX上でのC++ソフトウェア設計の定石 (2)

    鉄則2: シグナルハンドラで行ってよい処理を知ろう sigaction関数で登録したシグナルハンドラで行ってよい処理は非常に限定されている 次の3つの処理だけが許されている 自動変数の操作 “volatile sig_atomic_t” 型の大域変数の操作 「非同期シグナルセーフ」関数の呼び出し これ以外の処理を記述しないこと! 説明: シグナル受信時に何らかの処理を行うためには、シグナルハンドラと呼ばれる関数を用意し、それをsigaction関数でシグナル名と紐付けておけばOKです。しかし、シグナルハンドラ内で行ってよい処理は、上記の通り非常に限定されています。これを把握しないまま奔放なコードを書くと次のような現象が起き得ます: 問題1: プログラムがデッドロックする危険がある タイミングに依存する、再現困難なバグの原因となる デッドロックの発生が典型例だが、それ以外にも関数の戻り値不正

    memologue - UNIX上でのC++ソフトウェア設計の定石 (2)
  • 最近のdoxygenはスゴイ - pyopyopyo - Linuxとかプログラミングの覚え書き -

    doxygen*1 と言えば、cやc++のソースコードからドキュメントを自動生成する便利なソフトウェアです。この doxygen、ここ1年ぐらいですごく改良されています。ちょうど昨日(2010/6/15)に最新版の 1.7.0 がリリースされたので、この機会に最新版に乗り換えて、新機能の恩恵にあやかりましょう。 と言うわけで最近の目玉を二つ。 その1: "使いやすい"検索機能 最近のdoxygenは検索機能が付いています。 これはMSDNのオンラインヘルプのような感じで、関数名・変数名でマニュアルが検索できるものです。前方一致で検索するので、たとえば getと入力すれば、即getterの一覧が表示されます。 そして、この機能はブラウザのjavascriptやDHTMLを駆使して実現してあるので、わざわざビューア類を追加インストールする必要もありません。 すばらしい!!! この機能を有効にす

    最近のdoxygenはスゴイ - pyopyopyo - Linuxとかプログラミングの覚え書き -
  • Windows(VC++)でunistd.h - 萌えの値段

    Unix開発をVCでしろ、ソースにはVCの跡を残すな、って無茶な要求だけどしょうがない。 UnixメインのソースをVCでコンパイルする際に問題になることの一つがunistd.h。 gethostnameとかgetpidを使いたい場合に必要になってくる。 とりあえず動くように適当にヘッダを作ってみた。 //<unistd.h>をWindowsで使用するための定義 #ifndef _UNISTD_H_ #define _UNISTD_H_ #ifdef _WIN32 #pragma once #include <io.h> /* access chmod chsize close creat dup dup2 eof filelength isatty locking lseek mktemp open read setmode sopen tell umask unlink write */

    Windows(VC++)でunistd.h - 萌えの値段
  • LinuxのC言語で Shift-JIS と UTF-8 の相互変換 - Natural Software

    とりあえず記録 libiconv - GNU Project - Free Software Foundation (FSF) 環境 でびあん GCC 4.3.2 っぽい ダウンロード wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.1.tar.gz インストール $ ./configure --prefix=/usr/local $ make $ make install とりあえずやった $ export LD_PRELOAD=/usr/local/lib/preloadable_libiconv.so libiconv.so.2 が見つかんないとかいいよるので # vi /etc/ld.so.conf /usr/local/lib ← 追加 # ldconfig ← 実行 Apache2.2のコンパイルでapxsエラー(l

    LinuxのC言語で Shift-JIS と UTF-8 の相互変換 - Natural Software
  • System Interfaces Chapter 2

    An implementation shall not introduce cancellation points into any other functions specified in this volume of IEEE Std 1003.1-2001. The side effects of acting upon a cancellation request while suspended during a call of a function are the same as the side effects that may be seen in a single-threaded program when a call to a function is interrupted by a signal and the given function returns [EINT

    tyru
    tyru 2009/11/13
    スレッドセーフでない関数一覧
  • [Linux Kernel Linked List Explained]

    (Note: This is a working copy, last updated on April 5th, 2005. Feel free to email your comments.) Introduction: Linux kernel is mostly written in the C language. Unlike many other languages C does not have a good collection of data structures built into it or supported by a collection of standard libraries. Therefore, you're probably excited to hear that you can borrow a good implementation of a

  • PC�o������ | Unix�nerrno����

    �����������d���������������������o�����������B �����������Y��������������������������(*�L�D�M) Unix�n������タ�s�����G���[�����������������G���[�l���������B �R�������������������������B�B�B��������Web������������������(T_T) ��������ゥ���������������������������������������B Unix�n�������������v���O�����������������A�����I���l��-1�������A ����errno�������G���[�R�[�h�����������A�������������������

  • Manpage of MMAP

    Section: Linux Programmer's Manual (2) Updated: 2008-06-05 Index JM Home Page roff page 名前 mmap, munmap - ファイルやデバイスをメモリにマップ/アンマップする 書式 #include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *addr, size_t length); 説明 mmap() は、新しいマッピングを呼び出し元プロセスの仮想アドレス空間に作成する。 新しいマッピングの開始アドレスは addr で指定される。マッピングの長さは length 引き数で指定される。 addr が NULL の場合、カーネ

  • コンピューター:C言語講座:mmapについて

    コンピューター:C言語講座:mmapについて 概要 mmapはファイルをメモリにマッピングするものです。わかりやすく言うと、UNIXのOSが行なっているページングやスワッピングを自プロセスで行なうようなものです。 これを使うメリットとしては、メモリ確保サイズが確保開始時に決定できない場合、簡単にはmalloc()で適当な量を確保し、足りなければrealloc()を使用して拡大することになりますが、realloc()を繰り返すとメモリ領域中に空きが出来やすく、大規模なシステムでは実際使用しているメモリより空き空間の方が数倍大きくなってしまい、メモリ不足で実行不可能になる場合があります。mmapを使用すれば、別々に拡大していくような管理が可能なので、また、スワップスペースとは別の位置に置くことにより、多数の動的メモリを必要とする場合に安全に動作することが可能になる場合があります。ただし、基

  • SANS - Internet Storm Center - Cooperative Cyber Threat Monitor And Alert System

    © 2024 SANS™ Internet Storm Center Developers: We have an API for you! Link To Us About Us Handlers Privacy Policy

    SANS - Internet Storm Center - Cooperative Cyber Threat Monitor And Alert System
  • Software Installation Log

    Contents SCSI card setup CD-R(W)ドライブを使用できるようにする 8hz-mp3mp3 encoder HTK … Hidden Markov Model Toolkit a2ps.pl …日語を含むテキストの印刷 archie …ソースファイルを探すための道具 cdda2wav … CD から .wav を生成 cdrdao … CD を disc-at-once mode で書き込む chasen … 形態素解析 chawan … chasen に読み付与 gnuplot …作図(など) 午後のこーだ … mp3 encoder julius … 日語ディクテーション timidity …ソフトウェア midi エンコーダ psutils … postscript の変換色々 samba … UNIX から Windows (あるいはその逆)ファ

    tyru
    tyru 2009/06/24
    新しめのgccで「error: initializer element is not constant」というエラーメッセージが出た時の対処法。こっちは初期化時に代入せずmainのé–
  • Supplement for patch (compile error)

    症  状(コンパイルエラー) 最近のCコンパイラ(gcc)でコンパイルする場合, glib のバージョンによっては, src/pad2ps/pad2ps.c のコンパイル時に, error: initializer element is not constant といった,エラーが生じます。 原  因 出力ファイルのポインタ変数 fp の初期化, FILE *fp = stdout; の部分が該当します。 標準出力 stdout が構造体のためです。 エラーを回避するために,この初期化をしないでコンパイルすると, pad2ps 関係のコマンド実行時に出力ファイル名を指定しないと, Segmentation fault (core dumped) となる不具合が生じます。 対処パッチ ( src/pad2ps/pad2ps.c ) #if defined(__linux__)

    tyru
    tyru 2009/06/24
    新しめのgccで「error: initializer element is not constant」というエラーメッセージが出た時の対処法
  • http://akigamyl.wiki.exeexe.net/wiki/C%C3%A8%C2%A8%C2%80%C3%A8%C2%AA%C2%9E:%C3%A3%C2%82%C2%AD%C3%A3%C2%83%C2%BC%C3%A3%C2%81%C2%AE%C3%A8%C2%AA%C2%AD%C3%A3%C2%81%C2%BF%C3%A8%C2%BE%C2%BC%C3%A3%C2%81%C2%BF%C3%A3%C2%80%C2%81%C3%A6%C2%A4%C2%9C%C3%A5%C2%87%C2%BA

    tyru
    tyru 2009/04/01
    *nix系でもgetch(), kbhit()
  • inotifyを使ってみる

    inotifyを使ってみる linux-2.6.13-rc3からディレクトリやファイルに変更が あった際にアプリケーションに通知してくれるinotifyという機能が追加されている。今までは同様のことをするためにdnotifyを使っていたのだ が、これはディレクトリにしか使えないなどお世辞にも使いやすいとは言えないものだったので、dnotifyの不満点を解消しさらに使いやすくしたもの がinotifyらしい。 インストール 今回はRCパッチを使うので、patch-2.6.13-rc3とLinux 2.6.12のソースを用意する(2.6.12.xではダメらしい)。 linux-2.6.12のソースを展開したら、展開したディレクトリでpatch-2.6.13-rc3.bz2を伸張してパッチを当てる。 # bzip2 -d patch-2.6.13-rc3 # patch

  • forkとwaitとゾンビプロセス - ファイヤープロジェクト

    forkはプロセスのコピーを作成する.そしてwaitで待つ.処理の流れが一から複数に分かれる様がフォークみたいだからforkなのだろうか. forkで何がコピーされるのか forkのサンプル wait waitのサンプル ゾンビプロセスについて forkで何がコピーされるのかforkはそれを実行したプロセスの子プロセスを作成する.子プロセスは親プロセスのコピーである.プロセスをどこまで実行したか(プログラムカウンタ?)もコピーされるので,子プロセスはforkの返り値が返るところから実行される(と,思う).あと,ファイルディスクリプタなどもオープンされていればそのままコピーされる.コピーされないのはpidやppidとファイルロックやサスペンド中のシグナルぐらいだろうか.そして,そのforkの返り値によって,プロセスは自分が親プロセスか子プロセスかを知ることができる. 成功すれば子プロセスに