280 likes | 574 Views
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
E N D
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 • mkdir - make directories • rm - remove files or directories • cd - change directory • man - format and display the on-line manual pages • … Reference: http://www.csie.nctu.edu.tw/~tsaiwn/course/introcs/history/linux/linux.tnc.edu.tw/techdoc/shell/book1.html
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> Command mode Edit mode Insert Delete Replace Copy ..... Command mode Exit Edit mode [Esc] Reference: http://www.csie.nctu.edu.tw/~tsaiwn/course/introcs/history/linux/linux.tnc.edu.tw/techdoc/vi.htm
FTP - WinSCP • Add new account • 使用工作站帳號密碼 • Port 22 • SFTP
FTP - FileZilla • 開啓站台管理員 • 新增站台 • 選SFTP • 登入型式(一般)
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.
fork() - example1 % gcc fork1.c -o fork1 % ./fork1 & [1] 16444 % my child is 16445 I am child! % ps PID TTY TIME CMD 16212 pts/18 00:00:00 tcsh 16444 pts/18 00:00:05 fork1 16445 pts/18 00:00:05 fork1 16446 pts/18 00:00:00 ps % killall -v fork1 Killed fork1(16444) with signal 15 Killed fork1(16445) with signal 15 [1] + Terminated ./fork1 #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 */ } }
fork() – example2 % gcc fork2.c -o fork2 % ./fork2 & [1] 16423 % my child is 36845 daemon on duty! I am the daemon! I am the daemon! … (loop) … #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 */ } } Open a new window to kill it % killall -v fork2 Or Direct input in the window to kill it Hint : 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 % ./thread1 In main: creating thread 0 Hello World! thread #0 In main: creating thread 1 Hello World! thread #1 In main: creating thread 2 Hello World! thread #2 In main: creating thread 3 Hello World! thread #3 In main: creating thread 4 Hello World! thread #4
pthread() – example2 void *doSomething(void *arg) { for (;;) { int tmp = *((int *)arg); cout << tmp; cout.flush(); sleep(tmp); } return NULL; } #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() – example2 cont. % g++ threads2.cpp -o threads2 -lpthread % ./thread2 211211211211211…(loop)…
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 • 先建立一個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 5 int 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); }