ふつうのLinuxプログラミングをやってみる その８，９，１０




有名な本らしいので買ってみました
<a target="_blank" href="https://www.amazon.co.jp/gp/product/4797328355/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797328355&linkCode=as2&tag=lespacetranqu-22&linkId=b690c3257ff896f2239f1107e5bf95a4">ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=lespacetranqu-22&l=am2&o=9&a=4797328355" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
<a target="_blank" href="https://www.amazon.co.jp/gp/product/B075ST51Y5/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B075ST51Y5&linkCode=as2&tag=lespacetranqu-22&linkId=aa0915aa60afe5a385a365f9059a2877">ふつうのLinuxプログラミング 第2版　Linuxの仕組みから学べるgccプログラミングの王道</a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=lespacetranqu-22&l=am2&o=9&a=B075ST51Y5" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />


> ふつうのLinuxプログラミングをやってみる その１
https://qiita.com/uturned0/items/b9ae846f2aff5865c074
ふつうのLinuxプログラミングをやってみる その2
https://qiita.com/uturned0/items/56beac990cdd6f1059ed
ふつうのLinuxプログラミングをやってみる その3
https://qiita.com/uturned0/items/675092da8aa89c4b1ff0
その４
https://qiita.com/uturned0/items/8f5765cfc0f0be8a1981
その５
https://qiita.com/uturned0/items/ab97deb489c994a836da
その６
https://qiita.com/uturned0/items/b7df48e87ae9170f3698
その７
https://qiita.com/uturned0/items/263151cf7c83bff7fac1
その７−３
https://qiita.com/uturned0/items/3fbf3ed6bb2a47325f59
その８，９，１０
https://qiita.com/uturned0/items/3d8314095c45aa0bf920


# 8-1 正規表現できるgrepを作る

regcomp() 正規表現パターンを作る
regexec() 正規表現検索を実行
regfree() regcompのパターンがあるメモリを解放

source
https://github.com/aamine/stdlinux2-source/blob/master/grep.c


# 8-2

Cの「文字」はただの数字。試すコード書いてみた.


```C
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
    char *str1= "Hello";
    char str2[15] = { 72, 101, 108, 108, 111 };
    printf("%s\n", str1);
    printf("%s\n", str2);

    int i;
    for(i=0; i<5; i++) {
         printf("str1: %d文字目は%cです．文字コードは十進数で%d，16進数で 0x%x です．\n", i+1, str1[i],  str1[i], str1[i]);
         printf("str2: %d文字目は%cです．文字コードは十進数で%d，16進数で 0x%x です．\n", i+1, str2[i],  str2[i], str2[i]);
    }

    exit(0);
}


```

result

```ruby
$ gcc -Wall text.c && ./a.out

Hello
Hello
str1: 1文字目はHです．文字コードは十進数で72，16進数で 0x48 です．
str2: 1文字目はHです．文字コードは十進数で72，16進数で 0x48 です．
str1: 2文字目はeです．文字コードは十進数で101，16進数で 0x65 です．
str2: 2文字目はeです．文字コードは十進数で101，16進数で 0x65 です．
str1: 3文字目はlです．文字コードは十進数で108，16進数で 0x6c です．
str2: 3文字目はlです．文字コードは十進数で108，16進数で 0x6c です．
str1: 4文字目はlです．文字コードは十進数で108，16進数で 0x6c です．
str2: 4文字目はlです．文字コードは十進数で108，16進数で 0x6c です．
str1: 5文字目はoです．文字コードは十進数で111，16進数で 0x6f です．
str2: 5文字目はoです．文字コードは十進数で111，16進数で 0x6f です．

```

なるほど。こんな簡単に行き来できるのか。今更だけど文字列を printf で %d にすれば数字として出せるのか


> 記号    意味
%d  整数（10進数）
%o  整数（8進数）
%x  整数（16進数）
%f  浮動小数点（実数）
%c  文字（1文字）
%s  文字列（1文字以上）
ref. http://www.isc.meiji.ac.jp/~re00079/EX2.2010/2010_22.html



文字コードは `man ascii` で見れる。

```ruby
$ man ascii

     The decimal set:

       0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel
       8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si
      16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb
      24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us
      32 sp    33  !    34  "    35  #    36  $    37  %    38  &    39  '
      40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /
      48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7
      56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?
      64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G
      72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O
      80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W
      88  X    89  Y    90  Z    91  [    92  \    93  ]    94  ^    95  _
      96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g
     104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o
     112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w
     120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del
```

H = 72 ですね。


# 8-2 日本語とか

マルチバイトなエンコーディングの話とか。


# 9-1 Linux directory tree

Unix/linuxのディレクトリツリーは標準規格 FHS (The Filesystem Hierarchy Standard)で決まってるらしい

/bin bootに必要なコマンド
/usr/bin それ以外の一般ユーザ向けコマンド
/usr/local/bin パッケージシステムの外で自分で入れるコマンド
/sbin 管理者用コマンド。boot時に必要な管理者用コマンドを含む。
/usr/sbin 平常時用のシステム管理コマンド、サーバプログラム
/lib ライブラリ（libxx.so, libxx.a) perl, ruby, pythonの言語ライブらいも
/usr/lib 同様
/usr/local/lib 自分で入れるライブラリ

# 9-2 /usr  

びっくりした。/usrは、/usr をまるごとファイル共有する前提で用意されてるらしい。
複数のマシンで共有共有していいものを置くんだっっって。へーーーー・・・そんなことしてるとこあるんかな・・・

共有できないファイルは /var へ 

/usr/src システムで使ってるコマンドのソースコード。カーネルのソースコードも。
/usr/include システムのヘッダファイル。カーネルのヘッダファイルは　/usr/include/linux, /usr/include/asm にある/usr/include/sysもカーネル関連
/usr/share アーキテクチャ（CPU種類）に依存しない、共有可能なファイル。ドキュメント(man, info)など。
/usr/share/man  manファイル。man1, man2.. はセクション番号に対応

man は roff というテキスト形式で書かれてる。へー。自分でもかけそうだな。と思って中身見たら、ちょっときつかった

trueコマンドの例
```
$ cat /usr/share/man/man1/true.1 


.Dt TRUE 1
.Os
.Sh NAME
.Nm true
.Nd Return true value.
.Sh SYNOPSIS
.Nm
.Sh DESCRIPTION
The
.Nm
utility always returns with exit code zero.
.Sh SEE ALSO
.Xr csh 1 ,
.Xr sh 1 ,
.Xr false 1
.Sh STANDARDS
The
.Nm
utility conforms to 
.St -p1003.2-92 .
````

### /usr/local 

/usr/local はディストリビューションがファイルを置かない場所。管理者（あなた）が管理する場所。
商用linuxでは、 /opt を /usr/local として使うことが多い。

あー、富士通さんのソフトが /opt 使ってたのは、なにかの商用linuxように開発されてたからなのかもな。

/usr/X11R6 は X windows sytemのルート。見たことないかも・・

# 9-3 /var

/var は頻繁に書き換えられるファイルを置く。共有目的には使わない、そのマシン専用の場所。

/var/spool メール、プリンタの入力がある

/var/run 起動中のプロセスID(PID file)
ここにPIDを記録して、終わるときに消すのがlinuxプロセスの"マナ−”。

/var/log おなじみlog

# 9.4 

/etc 設定ファイル。fstab, hosts など
/dev デバイスファイル

昔は /dev にすべてのデバイスファイルを手動で作っていたが、手間。接続されてる機器を勝手に作ればいい。その仕組が udev（古くはdevfs）
udevはカーネルの外で実装されている

/proc もともとはプロセスの情報を保存する procfs(Process File System)というファイルの場所だったが、システムのmetricsを置く場所としても使われるようになった
だから /proc/1 でprocess見れて、 /proc/cpuinfo でハードウェアのことが見えるのね

/boot もともとUNIXのカーネルはunixだったが、BSDからvmunixになった。vmは仮想メモリを扱えるようになった意味。それがlinuxになるとvmlinuxになり、圧縮が入って vmlinuz になった。

あー、そのvmだったのか


/var/tmp は /tmpと同じ用途だが、違ってrebootしても消えない。viのリカバリ用ファイルなどが置かれる。へー。

/home 実は /home という決まりはないので `$HOME` を使うのが正しい。なるほど。 `$HOME` は必ずあると思っていいみたい。








# 10

読み飛ばしてしまった。

ls, mkdir, rm, chmod の作り方など。

makeしたときによく出る ENOENT エラーは「親ディレクトリがない」エラーなんだって。
ENT は entry の意味だって。

dirent は directiry entry の略なんだって。

ent は entry. 覚えた。






次は１１章から。でも明日から大学だ。今回はここまでかな。