unix講習会

卒研の5年生が、Raspberry-PiやらWebサーバ使いたいやらで、 unixを触る機会が多いけど、基本が解らないので 講習会をして欲しいとの要望から、unixの講習会を行いました。 卒研の時間を使ったけど、中途半端になってもいけないので、3時間コースになりました。

unixを使うには

unixを使うと言っても、色々な方法がある。 HDDインストール、USBインストール、 Windowsの仮想サーバ上にインストール(ただしLinuxは不安定)。 自前のサーバでなければ、Remote Desktopで接続、Rloginなどからssh接続。 ちょっと本物との違いがあるかもしれないけど、Cygwin,MinGWをインストール。

unixには様々なものがあるが、大きく分けるとBSD系(FreeBSD,NetBSD)、 Mac OS X、Linux。 Linuxといっても、Linux自体はカーネル部分だけであり、フリーの周辺ソフトを 取りまとめたディストリビューションがいくつかある。 有名なのは、RedHat系(CentOS,Fedra)、Debian系(Debian,Ubuntu)。 最近であれば、Ubuntuを入れるのが無難だろう。

unixの最初

まずは、login してもらって、ディレクトリ構成やら簡単な設定方法を説明。

/boot 起動に必要なもの
/bin  必要最低限の実行プログラム
/sbin 必要最低限の管理者向け実行プログラム
/lib  ライブラリやモジュールなど
/home ユーザのディレクトリ
/etc  設定ファイル
/var  プログラムが可変データを保存する場所
/tmp  だれでも書き込める作業用データの置き場
/usr/bin  一般的な実行プログラム
/usr/sbin 一般的な管理者向け実行プログラム
/usr/local/bin そのシステム固有の実行プログラム
/usr/local/sbin そのシステム固有の管理者向け実行プログラム
/dev  デバイスファイル

unixで設定を行う場合、システム全体に関係する設定は、/etc/配下のファイル、 各ユーザ固有の設定は、$HOME/配下の "." で始まる隠しファイルを使う。

各ユーザの情報は、/etc/passwd,/etc/group などで管理され、 passwdファイルの最後の欄には、login-shell などが記載される。

shellの基本

shellは、コマンドの対応処理をしてくれるが、基本設定は、.bashrc や .profile で 設定する。サーバの簡単な設定を行うだけであれば、基本的なバッチファイル (shell-script)の書き方を知っていればいい。

変数代入・参照、if,case などの概略だけを説明する。

そういえば、chmod で実行フラグの説明しなかったな...

shell-scriptでは、環境変数とshell変数があり、環境変数は子プロセス起動時に 引き継がれる。 環境変数で、重要な、LANG,PATH,LD_LIBRARY_PATH などを説明する。

分割コンパイルの説明

フリーのソフトを個別ダウンロード・コンパイルする学生も多い一方で、 make の意味やらが解らない人も多いので、分割コンパイルやmakeを説明。

複数のプログラムから、一つのプログラムを作る場合には、ヘッダファイルなどの 書き方が重要なので、4年の情報構造論でやったネタを分割する場合で説明。

(( list.h ))
struct List {
    int  data ;
    struct List* next ;
} ;
struct List* cons( int , struct List* ) ;
void print( struct List* ) ;
extern int count ;
------------------------------------------------
(( list.c ))
#include <stdio.h>
#include <stdlib.h>
#include "list.h"

int count = 0 ; // cons実行回数のカウント

struct List* cons( int x , struct List* n ) {
    struct List* nn ;
    count++ ;
    nn = (struct List*)malloc( sizeof( struct List ) ) ;
    if ( nn != NULL ) {
        nn->data = x ;
        nn->next = n ;
    }
    return nn ;
}
void print( struct List* p ) {
    for( ; p != NULL ; p = p->next )
        printf( "%d¥n" , p->data ) ;
}
------------------------------------------------
(( main.c ))
#include <stdio.h>
#include "list.h"

int main() {
    struct List* l = cons( 1 , cons( 2 , cons( 3 , NULL ) ) ) ;
    print( l ) ;
    printf( "%d¥n" , count ) ;
    return 0 ;
}

共通のヘッダファイルには、構造体宣言やプロトタイプ宣言を記載する。

Makefileの書き方

前述のlist.c,main.c をコンパイルするには、必要最小限の処理毎に行う場合は、 以下の3つのコマンドで行う。

$ gcc -c list.c
$ gcc -c main.c
$ gcc list.o main.o
----------------
   $ gcc list.c main.c であれば、一度にできるけどmakeの理解のため。

プログラムの修正があった場合には、3つのどのコマンドを実行すべきかは、 人間が考えるのは煩雑。そこで make を使う。 make は、ファイルの日付情報を元に必要最小限の処理を行ってくれる。

(( Makefile ))
a.out: list.o main.o
        gcc list.o main.o
list.o: list.c list.h
        gcc -c list.c
main.o: main.c list.h
        gcc -c main.c

しかし、gcc のコンパイラを別なものを使うとか、特殊なライブラリを使う場合、 makeの変数を使って書き換えを容易に行えるようにする。

CC = gcc
CFLAGS = -Wall # -DDEBUG

a.out: list.o main.o
        $(CC) list.o main.o
list.o: list.c list.h
        $(CC) $(CFLAGS) -c list.c
main.o: main.c list.h
        $(CC) $(CFLAGS) -c main.c
 

2015年12月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

アーカイブ

Google

このブログ記事について

このページは、T-Saitohが2014年7月 2日 21:38に書いたブログ記事です。

ひとつ前のブログ記事は「構造図(UML)」です。

次のブログ記事は「ファイル操作の基本」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。