Linux Programming – Process & Signal Reporter: P-J L
起始新程序 (1/2) #include <stdlib.h> int system(const char *string); Example 2007/7/27 Po-Sen Wang
起始新程序 (2/2) 使用 system 函數在背景執行 Example 2007/7/27 Po-Sen Wang
程序的替換 (1/3) #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg0, ..., (char *) 0); int execlp(const char *file, const char *arg0, ..., int execle(const char *path, const char *arg0, ..., (char *) 0, const char *envp[]); int execv(const char *path, const char *argv[]); int execvp(const char *file, const char *argv[]); int execve(const char *path, const char *argv[], const char *envp[]); 2007/7/27 Po-Sen Wang
程序的替換 (2/3) 使用 exec 函數來起始 ps 程式: const char *ps_argv[]={“ps”, “-ax”, 0}; const char *ps_envp[]= {“PATH=/bin:/usr/bin”, “TERM=console”, 0}; execl(“/bin/ps”, “ps”, “-ax”, 0); execlp(“ps”, “ps”, “-ax”, 0); execle(“/bin/ps”, “ps”, “-ax”, 0, ps_envp); execv(“/bin/ps”, ps_argv); execvp(“ps”, ps_argv); execve(“/bin/ps”, ps_argv, ps_evnp); 2007/7/27 Po-Sen Wang
程序的替換 (3/3) Example 2007/7/27 Po-Sen Wang
複製程序 (1/2) #include <sys/types.h> #include <unistd.h> pid_t fork(void); 起始程序 fork() 傳回子程序PID 傳回0 父始程序繼續執行 子程序 2007/7/27 Po-Sen Wang
複製程序 (2/2) Example 2007/7/27 Po-Sen Wang
等待程序 (1/2) #include <sys/types.h> #include <sys/wait.h> pid_t wait(int *stat_val); 巨集 WIFEXITED(stat_val) 子程序正常終止,傳回非零值 WEXITSTATUS(stat_val) WIFEXITED非零,傳回子程序離開碼 WIFSIGNALED(stat_val) 子程序因漏失訊號而終止,傳回非零值 WTERMSIG(stat_val) WIFSIGNALED非零,傳回訊號碼 WIFSTOPPED(stat_val) 子程序因為收到訊號而停止,傳回非零值 WSTOPSIG(stat_val) WIFSTOPPED非零,傳回訊號碼 2007/7/27 Po-Sen Wang
等待程序 (2/2) 2007/7/27 Po-Sen Wang
Signal (1/2) 一些會造成程序立即終止的訊號: SIGABORT 程序停止 SIGALRM 警示 SIGFPE 浮點數例外 SIGHUP 掛斷 SIGILL 非法指令 SIGINT 終端機插斷 SIGKILL Kill(無法被捕捉或忽略) SIGPIPE 寫入一無收取端的pipe SIGQUIT 終端機終止 SIGSEGV 存取無效的記憶體區段 2007/7/27 Po-Sen Wang
Signal (2/2) #include <signal.h> void (*signal(int sig, void (*func)(int)))(int); func可以自定,或是SIG_IGN(忽略訊息)、SIG_DFL(恢復預設的行為) Example 2007/7/27 Po-Sen Wang
傳送訊息 (1/2) #include <sys/types.h> #include <signal.h> int kill(pid_t pid, int sig); #include <unistd.h> unsigned int alarm(unsigned int seconds); 2007/7/27 Po-Sen Wang
傳送訊息 (2/2) 2007/7/27 Po-Sen Wang
Sigaction (1/2) #include <signal.h> int sigaction(int sig, const struct sigaction *act, struct sigaction *oact) sigaction struct 的部分成員: void (*sa_handler)(int); //function, SIG_DFL, SIG_IGN sigset_t sa_mask; //signals to block in sa_handler int sa_flags; //signal action modifiers sa_flags: SA_NOCLDSTOP 當子程序停止時則不要產生SIGCHLD SA_RESETHAND 將訊號接收動作重設為SIG_DEL SA_RESTART 重新啟動可插斷函數,而非EINTR錯誤 SA_NODEFER 捕捉時不要將訊號加到mask中 2007/7/27 Po-Sen Wang
Sigaction (2/2) 2007/7/27 Po-Sen Wang
作業 請撰寫一程式產生一子程序。 父程序分別印出父程序及子程序的id,並等待子程序傳送SIGALRM訊號。接收到SIGALRM訊號後,在營幕上印出”Child process finish.”訊息。 子程序去執行另一個1加到100的程式,並傳送SIGALRM訊號給父程序。 2007/7/27 Po-Sen Wang