FreeBSD初心者運用日記 このページをアンテナに追加

2008-08-17

[]「UNIXシステムプログラミング」読書メモ 00:43 「UNIXシステムプログラミング」読書メモ - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - 「UNIXシステムプログラミング」読書メモ - FreeBSD初心者運用日記 「UNIXシステムプログラミング」読書メモ - FreeBSD初心者運用日記 のブックマークコメント

#include<...>で囲まれたシステムファイルの場所は、/usr/include配下にある。

ccコマンドのvオプションでシステムファイルの場所を確認することも出来る。

2008-08-04

[][]mmapシステムコールについて 01:39 mmapシステムコールについて - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - mmapシステムコールについて - FreeBSD初心者運用日記 mmapシステムコールについて - FreeBSD初心者運用日記 のブックマークコメント

下記ページにサンプルプログラムがあるので試してみる。

http://www.ncad.co.jp/~komata/c-kouza20.htm

2008-05-28

[][]外部配列sys_errlistの中身を表示するプログラム 08:11 外部配列sys_errlistの中身を表示するプログラム - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - 外部配列sys_errlistの中身を表示するプログラム - FreeBSD初心者運用日記 外部配列sys_errlistの中身を表示するプログラム - FreeBSD初心者運用日記 のブックマークコメント

外部配列sys_errlistには、システムコールのエラーメッセージ?が格納されているらしい。

その中身を表示するプログラム。

参考:UNIXシステムプログラミング

プログラム

#include <stdio.h>

int main(void) {
    int i;
    printf("sys_nerr = %d\n", sys_nerr);

    for (i=0; i < sys_nerr; i++) {
        printf("%d %s\n", i, sys_errlist[i]);
    }
    exit(0);
}

実行結果

$ gcc hoge.c -o hoge
$ ./hoge | head
sys_nerr = 89
0 Undefined error: 0
1 Operation not permitted
2 No such file or directory
3 No such process
4 Interrupted system call
5 Input/output error
6 Device not configured
7 Argument list too long
8 Exec format error

2008-05-27

[][]システムコールについて 08:15 システムコールについて - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - システムコールについて - FreeBSD初心者運用日記 システムコールについて - FreeBSD初心者運用日記 のブックマークコメント

  • printf関数は、いきつくところwriteシステムコール関数を利用しているにすぎない。
  • システムコールは、ユーザプログラムからカーネルの機能を利用するためのインタフェースにすぎず、アセンブリで書かれた数行のプログラム。
  • それぞれのシステムコールには番号が割り当てられている。
  • システムコールはエラーになると返却値に-1を返し、外部変数errnoにエラー番号が格納される。
  • 使う側からすると、システムコールもライブラリ関数も違いはない。
  • システムコール関数内ではトラップ命令が実行される(何の?)

2008-05-25

[]環境変数を出力 23:58 環境変数を出力 - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - 環境変数を出力 - FreeBSD初心者運用日記 環境変数を出力 - FreeBSD初心者運用日記 のブックマークコメント

  • プログラム
$ vi main.c
#include <stdio.h>
int main(int argc, char *argv[], char *envp[]){
        int i;
        for (i = 0; i < argc; i++) {
                printf("i=%d : ", i);
                printf("%s\n", argv[i]);
        }

        for (i = 0; envp[i]; i++) {
                printf("%s\n", envp[i]);
        }
}
  • 実行結果
$ ./a.out aaa bbb ccc
i=0 : ./a.out
i=1 : aaa
i=2 : bbb
i=3 : ccc
SHELL=/bin/bash
TERM=vt100-color
HISTSIZE=9999
SSH_CLIENT=192.168.0.2 1654 22
CVSROOT=/home/cvs
SSH_TTY=/dev/ttyp0
USER=xxx
FTP_PASSIVE_MODE=YES
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin:/home/vitamin/bin:/home/wget/bin
MAIL=/var/mail/xxx
BLOCKSIZE=K
PWD=/home/xxx
SHLVL=1
HOME=/home/xxx
LOGNAME=xxx
SSH_CONNECTION=192.168.0.2 1654 192.168.0.12 22
_=./a.out

環境変数を操作する関数として、getenvやsetenvがある。