33
Unix 教教

Unix 教學. Unix-like System Linux FreeBSD Solaris Mac OS X …

Embed Size (px)

Citation preview

Unix 教學

Unix-like System

• Linux• FreeBSD• Solaris• Mac OS X• …

Tools

• Login in tools– Putty / pietty

• Editor– ee(Easy Editor)– vi

• FTP tools– WinSCP– FileZilla Client

How to use putty/pietty?

• Putty– http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

• Pietty– http://www.csie.ntu.edu.tw/~piaip/pietty/

Login in

• the default for SSH service is port 22– bsd1.cs.nctu.edu.tw – bsd5.cs.nctu.edu.tw– linux1.cs.nctu.edu.tw – linux6.cs.nctu.edu.tw– …

Unix-like command - Shell

• Command– ls - list directory contents– mv - move files or directories– mkdir - make directories– rm - remove files or directories– cd - change directory– man - format and display the on-line manual pages– chmod - change file system modes of files and directories.– …

Reference:http://www.csie.nctu.edu.tw/~tsaiwn/course/introcs/history/linux/linux.tnc.edu.tw/techdoc/shell/book1.html

Unix-like command - Shell

• Command– ls -a• Include directory entries whose names begin with a

dot (`.').

– ls -l• (The lowercase letter ``ell''.) List files in the long

format, as described in the The Long Format subsection below.

– man ls

Unix-like command - Shell

• Command– mkdir [folder_name] (create folder)– rmdir [folder_name] (delete folder)

– rm [file_name] (delete file)

– mv [source] [target] (move files or folder)

Unix-like command - Shell

• Command– cd [directory] (change the working directory)

– pwd (return working directory name)

– chmod [mode] [file] (change file modes)• Mode : [user][group][guest]

-rwxrwxrwx 1 user group 1 Sep 28 2010 test.txt

Ex. chmod 644 test.txt-rw-r--r-- 1 user group 1 Sep 28 2010 test.txt

Unix-like command - Shell

• Command– man man• (format and display the on-line manual pages)

• Other:– Reference:• http://www.csie.nctu.edu.tw/~tsaiwn/course/introcs/h

istory/linux/linux.tnc.edu.tw/techdoc/shell/book1.html• http://linux.vbird.org/linux_basic/redhat6.1/linux_06co

mmand.php

ee/edit

• BSD only

• Start ee : % ee <input filename>• Usage– edit mode like notepad– ESC-ENTER : save/exit

vi

• Vi editor have two modes– Command mode– Edit mode

• start vi:%vi <filename>

Reference:http://www.csie.nctu.edu.tw/~tsaiwn/course/introcs/history/linux/linux.tnc.edu.tw/techdoc/vi.htm

Command mode

Command mode

Edit mode

Exit Edit mode

InsertDeleteReplaceCopy .....

[Esc]

FTP - WinSCP

• Add new account–使用工作站帳號密碼– Port 22– SFTP

FTP - FileZilla

• 開啓站台管理員• 新增站台• 選 SFTP• 登入型式 (一般 )

Fork & thread 教學

fork

• fork - create a new process– The new process (child process) shall be an exact

copy of the calling process (parent process)– The child process shall have a unique process

ID(different parent process ID).– The return value in the child is 0,whereas the

return value in the parent is the process ID of the new child.

– It return only -1 when fork failed.

#include <stdio.h>#include<stdlib.h>#include <unistd.h>

int main(void){

pid_t pid;pid = fork();switch (pid) {

case -1: printf("failure!\n"); break;case 0: printf("I am child!\n"); break;default: printf("my child is %d\n",pid); break;

}for (;;) { /* do something here */ }

}

% gcc fork1.c -o fork1

% ./fork1 &[1] 16444% my child is 16445I am child!

% ps PID TTY TIME CMD16212 pts/18 00:00:00 tcsh16444 pts/18 00:00:05 fork116445 pts/18 00:00:05 fork116446 pts/18 00:00:00 ps

% killall -v fork1Killed fork1(16444) with signal 15Killed fork1(16445) with signal 15[1] + Terminated ./fork1

fork() - example1

fork() – example2#include <stdio.h>#include<stdlib.h>#include <unistd.h>

int main(void){

pid_t pid;pid = fork();if (pid>0) {

printf("my child is %d\n",pid);printf("daemon on duty!\n");/* do something here */exit(0);

} else if (pid<0) {printf("Can't fork!\n");exit(-1);

}for (;;) {

printf("I am the daemon!\n");usleep(300000); //sleep 0.3 seconds/* do something here */

}}

% gcc fork2.c -o fork2% ./fork2 &[1] 16423% my child is 36845daemon on duty!I am the daemon!I am the daemon!…(loop)…

Open a new window to kill it% killall -v fork2

Or

Direct input in the window to kill itHint : we can use copy-paste to do it% killall -v fork2

Thread• Light weight process• Share resources• Own private data• Synchronization

Pthread API• int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void

*(*start_routine)(void *), void *arg);– create a new thread with given attributes

• int pthread_join(pthread_t thread, void **status);– suspend caller until thread argument ends

• void pthread_exit(void *status);– terminate calling thread

• int pthread_equal(pthread_t t1, pthread_t t2)– test if two thread IDs are to same thread

• int pthread_cancel(pthread_t thread)– start cleanup and termination of given thread

• int pthread_kill(pthread_t thread, int sig)– send given signal to specified thread

• pthread_t pthread_self(void)– return ID of calling thread

Pthread API cont.

• pthread_mutex_destroy()– destroy a mutex

• pthread_mutex_init()– initialise a mutex

• pthread_mutex_lock()– get mutex lock blocking while already locked

• pthread_mutex_trylock()– try to get mutex lock, fail if already locked

• pthread_mutex_unlock()– release lock on a mutex

How to create Pthread in unix-like OS?

• Linux, BSD, Saloris…etc– Include:• #include <pthread.h>

– Command line:• % g++ threads.cpp -lpthread -o threads

pthread() – example1#include<pthread.h>#include<stdio.h>#include <unistd.h>

#define NUM_THREADS 5

void *PrintHello(void *);

int main (int argc, char *argv[]){ pthread_t threads[NUM_THREADS]; int rc , t; for(t=0;t<NUM_THREADS;t++) { printf("In main: creating thread %d\n", t); rc = pthread_create(&threads[t] , NULL , PrintHello , (void *)&t); usleep(1000); if(rc) { printf("ERROR; return code from pthread_create() is %d\n", rc); exit(-1); } }}

void *PrintHello(void *threadid){ int tid = *((int *)threadid); printf("Hello World! thread #%d\n", tid); pthread_exit(NULL);}

pthread() – example1 cont.% g++ threads1.cpp -o threads1 -lpthread

% ./thread1In main: creating thread 0Hello World! thread #0In main: creating thread 1Hello World! thread #1In main: creating thread 2Hello World! thread #2In main: creating thread 3Hello World! thread #3In main: creating thread 4Hello World! thread #4

#include <iostream>#include <pthread.h>using namespace std;

void *doSomething(void * arg);

int main() { int tmp1=1, tmp2=2; pthread_t t1; if ( pthread_create(&t1, NULL, doSomething, (int *)&tmp1) != 0 ) { cout << "pthread_create() error" << endl; exit(-1); } doSomething((int *)&tmp2);}

pthread() – example2void *doSomething(void *arg) { for (;;) { int tmp = *((int *)arg); cout << tmp; cout.flush(); sleep(tmp); } return NULL;}

pthread() – example2 cont.

% g++ threads2.cpp -o threads2 -lpthread

% ./thread2211211211211211…(loop)…

Assignment

1-1: try to use fork() and Pthread

• Just “rand()” two global integer between 1~10, then add them up

• VER. Fork: create a child process, then child rand() int1, parent rand() int2, child add up int1 and int2(YES! communication between process!)

• VER. Thread: create two threads, thread1 rand() int1,then sleep(int1), thread2 rand() int2, then sleep(int2); then main process add up int1 and int2.

1-2: producer and consumer• First,build a GLOBAL BUFFER,it’s a queue(only

need FIFO array,don’t need to creat a queue)• Build a producer thread and consumer thread• Producer: put numbers by rand() into buffer,you

can’t put more number when the buffer is full.• Consumer: Take out the numbers in the buffer,

you can’t take more number out when the buffer is empty.

• Print out the number and its location in buffer from Producer,and Print out the number and its location in buffer from Consumer (see textbook 7th. Edition Ch3-4)

1-2: producer and consumer

• 先建立一個 GLOBAL 的 BUFFER,它是一個 queue(只需有 FIFO效果的 array,不用真的實作 queue)

• 建立 producer thread 與 consumer thread• Producer的工作是把 rand()出來的數字放入

buffer 中 ,如果 buffer已經滿了就不能再放• Consumer的工作是把 buffer中的數字取出 ,如果

buffer是空的就不能取• 印出 Producer放入幾號 buffer跟放入的數字 ,同

理 consumer印出取出的數字跟 buffer的號碼• (詳見恐龍本第 7 版 3-4)

1-2 cont.• Buffer size=5• Number of consumer and producer =12

• Simple Output:– producer(1)-producer put [208] in buffer[0]– producer(2)-producer put [142] in buffer[1]– consumer(1)-consumer get [208] in buffer[0] is– producer(3)-producer put [66] in buffer[2]– producer(4)-producer put [241] in buffer[3] – producer(5)-producer put [164] in buffer[4] – consumer(2)-consumer get [142] in buffer[1]– producer(6)-producer put [7] in buffer[0] ……………..

1-2 cont.#include<stdio.h>#include<pthread.h>#include <time.h>#define BUFFER_SIZE 5int buffer[BUFFER_SIZE];void * consumer(void *argv){

for (int num=0;num<12;num++){ sleep(rand()%10);//write here

}}void * producer(void *argv){

for (int num=0;num<12;num++){ sleep(rand()%5); //write here

}}int main(){

int errno; srand((int)time(0)); pthread_t p_tid, c_tid;pthread_create(&c_tid, NULL, consumer, NULL); pthread_create(&p_tid, NULL, producer, NULL); pthread_join(c_tid ,NULL); pthread_join(p_tid ,NULL);

}

Q & A