一、alarm(設置信號傳送鬧鐘)
相關函數 signal,sleep
表頭文件 #include<unistd.h>
定義函數 unsigned int alarm(unsigned int seconds);
函數說明 alarm()用來設置信號SIGALRM在經過參數seconds指定的秒數後傳送給目前的進程。如果參數seconds 為0,則之前設置的鬧鐘會被取消,並將剩下的時間返回。
返回值返回之前鬧鐘的剩余秒數,如果之前未設鬧鐘則返回0。
范例 #include<unistd.h>
#include<signal.h>
void handler() {
printf("hello\n");
}
main()
{
int i;
signal(SIGALRM,handler);
alarm(5);
for(i=1;i<7;i++){
printf("sleep %d ...\n",i);
sleep(1);
}
}
執行 sleep 1 ...
sleep 2 ...
sleep 3 ...
sleep 4 ...
sleep 5 ...
hello
sleep 6 ...
二、kill(傳送信號給指定的進程)
相關函數 raise,signal
表頭文件 #include<sys/types.h>
#include<signal.h>
定義函數 int kill(pid_t pid,int sig);
函數說明 kill()可以用來送參數sig指定的信號給參數pid指定的進程。參數pid有幾種情況:
pid>0 將信號傳給進程識別碼為pid 的進程。
pid=0 將信號傳給和目前進程相同進程組的所有進程
pid=-1 將信號廣播傳送給系統內所有的進程
pid<0 將信號傳給進程組識別碼為pid絕對值的所有進程
參數sig代表的信號編號可參考附錄D
返回值 執行成功則返回0,如果有錯誤則返回-1。
錯誤代碼 EINVAL 參數sig 不合法
ESRCH 參數pid 所指定的進程或進程組不存在
EPERM 權限不夠無法傳送信號給指定進程
范例 #include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/wait.h>
main()
{
pid_t pid;
int status;
if(!(pid= fork())){
printf("Hi I am child process!\n");
sleep(10);
return;
}
else{
printf("send signal to child process (%d) \n",pid);
sleep(1);
kill(pid ,SIGABRT);
wait(&status);
if(WIFSIGNALED(status))
printf("chile process receive signal %d\n",WTERMSIG(status));
}
}
執行 sen signal to child process(3170)
Hi I am child process!
child process receive signal 6
三、pause(讓進程暫停直到信號出現)
相關函數 kill,signal,sleep
表頭文件 #include<unistd.h>
定義函數 int pause(void);
函數說明 pause()會令目前的進程暫停(進入睡眠狀態),直到被信號(signal)所中斷。
返回值 只返回-1。
錯誤代碼 EINTR 有信號到達中斷了此函數。
sigaction(查詢或設置信號處理方式)
相關函數 signal,sigprocmask,sigpending,sigsuspend
表頭文件 #include<signal.h>
定義函數 int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);
函數說明 sigaction()會依參數signum指定的信號編號來設置該信號的處理函數。參數signum可以指定SIGKILL和SIGSTOP以外的所有信號。
如參數結構sigaction定義如下
struct sigaction
{
void (*sa_handler) (int);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer) (void);
}
sa_handler此參數和signal()的參數handler相同,代表新的信號處理函數,其他意義請參考signal()。
sa_mask 用來設置在處理該信號時暫時將sa_mask 指定的信號擱置。
sa_restorer 此參數沒有使用。
sa_flags 用來設置信號處理的其他相關操作,下列的數值可用。
OR 運算(|)組合
A_NOCLDSTOP : 如果參數signum為SIGCHLD,則當子進程暫停時並不會通知父進程
SA_ONESHOT/SA_RESETHAND:當調用新的信號處理函數前,將此信號處理方式改為系統預設的方式。
SA_RESTART:被信號中斷的系統調用會自行重啟
SA_NOMASK/SA_NODEFER:在處理此信號未結束前不理會此信號的再次到來。
如果參數oldact不是NULL指針,則原來的信號處理方式會由此結構sigaction 返回。
返回值 執行成功則返回0,如果有錯誤則返回-1。
錯誤代碼 EINVAL 參數signum 不合法,或是企圖攔截SIGKILL/SIGSTOPSIGKILL信號
EFAULT 參數act,oldact指針地址無法存取。
EINTR 此調用被中斷