unix 教學. unix-like system linux freebsd solaris mac os x …
TRANSCRIPT
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]
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
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)…
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);
}