developer's diary

最近はc#のエントリが多いです

C初心者がmemcached-1.4.5を追いかける。(4)

C初心者がmemcached-1.4.5を追いかける。(3)の続き
ソースはコチラにてDLしました。

memcached.c(4296行目あたり)

    /* process arguments */
    /* 引数プロセス */
    while (-1 != (c = getopt(argc, argv,
          "a:"  /* access mask for unix socket */
          "p:"  /* TCP port number to listen on */
          "s:"  /* unix socket path to listen on */
          "U:"  /* UDP port number to listen on */
          "m:"  /* max memory to use for items in megabytes */
          "M"   /* return error on memory exhausted */
          "c:"  /* max simultaneous connections */
          "k"   /* lock down all paged memory */
          "hi"  /* help, licence info */
          "r"   /* maximize core file limit */
          "v"   /* verbose */
          "d"   /* daemon mode */
          "l:"  /* interface to listen on */
          "u:"  /* user identity to run as */
          "P:"  /* save PID in file */
          "f:"  /* factor? */
          "n:"  /* minimum space allocated for key+value+flags */
          "t:"  /* threads */
          "D:"  /* prefix delimiter? */
          "L"   /* Large memory pages */
          "R:"  /* max requests per event */
          "C"   /* Disable use of CAS */
          "b:"  /* backlog queue limit */
          "B:"  /* Binding protocol */
          "I:"  /* Max item size */
          "S"   /* Sasl ON */
        ))) {
        switch (c) {
        case 'a':
            /* access for unix domain socket, as octal mask (like chmod)*/
            /* strtol :文字列をlong値に変換*/
            settings.access= strtol(optarg,NULL,8);
            break;

getopt(3)を使用してオプションの設定をしている所。


Googleのソースコード検索で"while (-1 != (c = getopt(argc, argv,"を検索

ここでは↓のやり方

    while ((result = getopt(argc, argv, "abcd:e:")) != -1) {
        switch (result) {
        case '.....':

        }
    }

memcashed.cでは

    while (-1 != (c = getopt(argc, argv,
          "a:"  /* access mask for unix socket */
          "p:"  /* TCP port number to listen on */
        ))) {
        switch (c) {
        case '.....':
        }
    }

ふつうのLinuxプログラミングだと

    while ((opt = getopt(argc, argv, "af:tx")) != -1) {
        switch (opt) {
        case '.....':

        }
    }

・・・・凄い気になった所で、
"a:" "p:"は文字列が並んでいるだけだ。
JavaやVB、Ruby等のスクリプト言語とかだとエラーとなるはず。でもmemcashed.cのソースではやってのけている。

Googleのソースコード検索で"while (-1 != (c = getopt(argc, argv,"を検索した結果を見ると、"abcd:e:"なふうな記述もあって拡張したCなのか?!
と頭を悩ませて、会社の先輩に尋ねてみると。Yahoo!¥¸¥ª¥·¥Æ¥£¡¼¥ºを教えて頂きました。

○文字列定数の連結
次のように文字列定数をつなげて書くと、コンパイル時に連結されて1つの文字列定数として扱われます

s = "abcde""fghij";
非常に長い文字列定数を扱いたいときには、2行に分けて書くこともできます。

s = "abcdefghijklmn"
"opqrstuvwxyz";
C言語では、ソース上の改行は意味を持たないので、上のように書いても、2つの文字列定数は連結されて1つになります。

なるほど。そういえばPythonは文字列で複数行コメントを記述しているのを思い出した。
[Python] コメント - SumiTomohikoの日記

続きは↓へ
C初心者がmemcached-1.4.5を追いかける。(5){起動オプション -a}