日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux信号检查参数相同,linux信号函数

發(fā)布時(shí)間:2025/4/5 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux信号检查参数相同,linux信号函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

alarm(設(shè)置信號傳送鬧鐘)

相關(guān)函數(shù)

signal,sleep

表頭文件

#include

定義函數(shù)

unsigned int alarm(unsigned int seconds);

函數(shù)說明

alarm()用來設(shè)置信號SIGALRM在經(jīng)過參數(shù)seconds指定的秒數(shù)后傳送給目前的進(jìn)程。如果參數(shù)seconds 為0,則之前設(shè)置的鬧鐘會(huì)被取消,并將剩下的時(shí)間返回。

返回值

返回之前鬧鐘的剩余秒數(shù),如果之前未設(shè)鬧鐘則返回0。

范例

#include

#include

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);

}

}

執(zhí)行

sleep 1 ...

sleep 2 ...

sleep 3 ...

sleep 4 ...

sleep 5 ...

hello

sleep 6 ...

kill(傳送信號給指定的進(jìn)程)

相關(guān)函數(shù)

raise,signal

表頭文件

#include

#include

定義函數(shù)

int kill(pid_t pid,int sig);

函數(shù)說明

kill()可以用來送參數(shù)sig指定的信號給參數(shù)pid指定的進(jìn)程。參數(shù)pid有幾種情況:

pid>0 將信號傳給進(jìn)程識別碼為pid 的進(jìn)程。

pid=0 將信號傳給和目前進(jìn)程相同進(jìn)程組的所有進(jìn)程

pid=-1 將信號廣播傳送給系統(tǒng)內(nèi)所有的進(jìn)程

pid<0 將信號傳給進(jìn)程組識別碼為pid絕對值的所有進(jìn)程

參數(shù)sig代表的信號編號可參考附錄D

返回值

執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼

EINVAL 參數(shù)sig 不合法

ESRCH 參數(shù)pid 所指定的進(jìn)程或進(jìn)程組不存在

EPERM 權(quán)限不夠無法傳送信號給指定進(jìn)程

范例

#include

#include

#include

#include

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));

}

}

執(zhí)行

sen signal to child process(3170)

Hi I am child process!

child process receive signal 6

pause(讓進(jìn)程暫停直到信號出現(xiàn))

相關(guān)函數(shù)

kill,signal,sleep

表頭文件

#include

定義函數(shù)

int pause(void);

函數(shù)說明

pause()會(huì)令目前的進(jìn)程暫停(進(jìn)入睡眠狀態(tài)),直到被信號(signal)所中斷。

返回值

只返回-1。

錯(cuò)誤代碼

EINTR 有信號到達(dá)中斷了此函數(shù)。

sigaction(查詢或設(shè)置信號處理方式)

相關(guān)函數(shù)

signal,sigprocmask,sigpending,sigsuspend

表頭文件

#include

定義函數(shù)

int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

函數(shù)說明

sigaction()會(huì)依參數(shù)signum指定的信號編號來設(shè)置該信號的處理函數(shù)。參數(shù)signum可以指定SIGKILL和SIGSTOP以外的所有信號。

如參數(shù)結(jié)構(gòu)sigaction定義如下

struct sigaction

{

void (*sa_handler) (int);

sigset_t sa_mask;

int sa_flags;

void (*sa_restorer) (void);

}

sa_handler此參數(shù)和signal()的參數(shù)handler相同,代表新的信號處理函數(shù),其他意義請參考signal()。

sa_mask 用來設(shè)置在處理該信號時(shí)暫時(shí)將sa_mask 指定的信號擱置。

sa_restorer 此參數(shù)沒有使用。

sa_flags 用來設(shè)置信號處理的其他相關(guān)操作,下列的數(shù)值可用。

OR 運(yùn)算(|)組合

A_NOCLDSTOP : 如果參數(shù)signum為SIGCHLD,則當(dāng)子進(jìn)程暫停時(shí)并不會(huì)通知父進(jìn)程

SA_ONESHOT/SA_RESETHAND:當(dāng)調(diào)用新的信號處理函數(shù)前,將此信號處理方式改為系統(tǒng)預(yù)設(shè)的方式。

SA_RESTART:被信號中斷的系統(tǒng)調(diào)用會(huì)自行重啟

SA_NOMASK/SA_NODEFER:在處理此信號未結(jié)束前不理會(huì)此信號的再次到來。

如果參數(shù)oldact不是NULL指針,則原來的信號處理方式會(huì)由此結(jié)構(gòu)sigaction 返回。

返回值

執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼

EINVAL 參數(shù)signum 不合法, 或是企圖攔截SIGKILL/SIGSTOPSIGKILL信號

EFAULT 參數(shù)act,oldact指針地址無法存取。

EINTR 此調(diào)用被中斷

范例

#include

#include

void show_handler(struct sigaction * act)

{

switch (act->sa_flags)

{

case SIG_DFL:printf(“Default action\n”);break;

case SIG_IGN:printf(“Ignore the signal\n”);break;

default: printf(“0x%x\n”,act->sa_handler);

}

}

main()

{

int i;

struct sigaction act,oldact;

act.sa_handler = show_handler;

act.sa_flags = SA_ONESHOT|SA_NOMASK;

sigaction(SIGUSR1,&act,&oldact);

for(i=5;i<15;i++)

{

printf(“sa_handler of signal %2d =”.i);

sigaction(i,NULL,&oldact);

}

}

執(zhí)行

sa_handler of signal 5 = Default action

sa_handler of signal 6= Default action

sa_handler of signal 7 = Default action

sa_handler of signal 8 = Default action

sa_handler of signal 9 = Default action

sa_handler of signal 10 = 0x8048400

sa_handler of signal 11 = Default action

sa_handler of signal 12 = Default action

sa_handler of signal 13 = Default action

sa_handler of signal 14 = Default action

sigaddset(增加一個(gè)信號至信號集)

相關(guān)函數(shù)

sigemptyset,sigfillset,sigdelset,sigismember

表頭文件

#include

定義函數(shù)

int sigaddset(sigset_t *set,int signum);

函數(shù)說明

sigaddset()用來將參數(shù)signum 代表的信號加入至參數(shù)set 信號集里。

返回值

執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼

EFAULT 參數(shù)set指針地址無法存取

EINVAL 參數(shù)signum非合法的信號編號

sigdelset(從信號集里刪除一個(gè)信號)

相關(guān)函數(shù)

sigemptyset,sigfillset,sigaddset,sigismember

表頭文件

#include

定義函數(shù)

int sigdelset(sigset_t * set,int signum);

函數(shù)說明

sigdelset()用來將參數(shù)signum代表的信號從參數(shù)set信號集里刪除。

返回值

執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼

EFAULT 參數(shù)set指針地址無法存取

EINVAL 參數(shù)signum非合法的信號編號

sigemptyset(初始化信號集)

相關(guān)函數(shù)

sigaddset,sigfillset,sigdelset,sigismember

表頭文件

#include

定義函數(shù)

int sigemptyset(sigset_t *set);

函數(shù)說明

sigemptyset()用來將參數(shù)set信號集初始化并清空。

返回值

執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼

EFAULT 參數(shù)set指針地址無法存取

sigfillset(將所有信號加入至信號集)

相關(guān)函數(shù)

sigempty,sigaddset,sigdelset,sigismember

表頭文件

#include

定義函數(shù)

int sigfillset(sigset_t * set);

函數(shù)說明

sigfillset()用來將參數(shù)set信號集初始化,然后把所有的信號加入到此信號集里。

返回值

執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

附加說明

EFAULT 參數(shù)set指針地址無法存取

sigismember(測試某個(gè)信號是否已加入至信號集里)

相關(guān)函數(shù)

sigemptyset,sigfillset,sigaddset,sigdelset

表頭文件

#include

定義函數(shù)

int sigismember(const sigset_t *set,int signum);

函數(shù)說明

sigismember()用來測試參數(shù)signum 代表的信號是否已加入至參數(shù)set信號集里。如果信號集里已有該信號則返回1,否則返回0。

返回值

信號集已有該信號則返回1,沒有則返回0。如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼

EFAULT 參數(shù)set指針地址無法存取

EINVAL 參數(shù)signum 非合法的信號編號

signal(設(shè)置信號處理方式)

相關(guān)函數(shù)

sigaction,kill,raise

表頭文件

#include

定義函數(shù)

void (*signal(int signum,void(* handler)(int)))(int);

函數(shù)說明

signal()會(huì)依參數(shù)signum 指定的信號編號來設(shè)置該信號的處理函數(shù)。當(dāng)指定的信號到達(dá)時(shí)就會(huì)跳轉(zhuǎn)到參數(shù)handler指定的函數(shù)執(zhí)行。如果參數(shù)handler不是函數(shù)指針,則必須是下列兩個(gè)常數(shù)之一:

SIG_IGN 忽略參數(shù)signum指定的信號。

SIG_DFL 將參數(shù)signum 指定的信號重設(shè)為核心預(yù)設(shè)的信號處理方式。

關(guān)于信號的編號和說明,請參考附錄D

返回值

返回先前的信號處理函數(shù)指針,如果有錯(cuò)誤則返回SIG_ERR(-1)。

附加說明

在信號發(fā)生跳轉(zhuǎn)到自定的handler處理函數(shù)執(zhí)行后,系統(tǒng)會(huì)自動(dòng)將此處理函數(shù)換回原來系統(tǒng)預(yù)設(shè)的處理方式,如果要改變此操作請改用sigaction()。

范例

參考alarm()或raise()。

sigpending(查詢被擱置的信號)

相關(guān)函數(shù)

signal,sigaction,sigprocmask,sigsuspend

表頭文件

#include

定義函數(shù)

int sigpending(sigset_t *set);

函數(shù)說明

sigpending()會(huì)將被擱置的信號集合由參數(shù)set指針返回。

返回值執(zhí)

行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼

EFAULT 參數(shù)set指針地址無法存取

EINTR 此調(diào)用被中斷。

sigprocmask(查詢或設(shè)置信號遮罩)

相關(guān)函數(shù)

signal,sigaction,sigpending,sigsuspend

表頭文件

#include

定義函數(shù)

int sigprocmask(int how,const sigset_t *set,sigset_t * oldset);

函數(shù)說明

sigprocmask()可以用來改變目前的信號遮罩,其操作依參數(shù)how來決定

SIG_BLOCK 新的信號遮罩由目前的信號遮罩和參數(shù)set 指定的信號遮罩作聯(lián)集

SIG_UNBLOCK 將目前的信號遮罩刪除掉參數(shù)set指定的信號遮罩

SIG_SETMASK 將目前的信號遮罩設(shè)成參數(shù)set指定的信號遮罩。

如果參數(shù)oldset不是NULL指針,那么目前的信號遮罩會(huì)由此指針返回。

返回值

執(zhí)行成功則返回0,如果有錯(cuò)誤則返回-1。

錯(cuò)誤代碼

EFAULT 參數(shù)set,oldset指針地址無法存取。

EINTR 此調(diào)用被中斷

sleep(讓進(jìn)程暫停執(zhí)行一段時(shí)間)

相關(guān)函數(shù)

signal,alarm

表頭文件

#include

定義函數(shù)

unsigned int sleep(unsigned int seconds);

函數(shù)說明

sleep()會(huì)令目前的進(jìn)程暫停,直到達(dá)到參數(shù)seconds 所指定的時(shí)間,或是被信號所中斷。

返回值

若進(jìn)程暫停到參數(shù)seconds 所指定的時(shí)間則返回0,若有信號中斷則返回剩余秒數(shù)。

ferror(檢查文件流是否有錯(cuò)誤發(fā)生)

相關(guān)函數(shù)

clearerr,perror

表頭文件

#include

定義函數(shù)

int ferror(FILE *stream);

函數(shù)說明

ferror()用來檢查參數(shù)stream所指定的文件流是否發(fā)生了錯(cuò)誤情況,如有錯(cuò)誤發(fā)生則返回非0值。

返回值

如果文件流有錯(cuò)誤發(fā)生則返回非0值。

perror(打印出錯(cuò)誤原因信息字符串)

相關(guān)函數(shù)

strerror

表頭文件

#include

定義函數(shù)

void perror(const char *s);

函數(shù)說明

perror()用來將上一個(gè)函數(shù)發(fā)生錯(cuò)誤的原因輸出到標(biāo)準(zhǔn)錯(cuò)誤(stderr)。參數(shù)s所指的字符串會(huì)先打印出,后面再加上錯(cuò)誤原因字符串。此錯(cuò)誤原因依照全局變量errno的值來決定要輸出的字符串。

返回值

范例

#include

main()

{

FILE *fp;

fp = fopen(“/tmp/noexist”,”r+”);

if(fp = =NULL) perror(“fopen”);

}

執(zhí)行

$ ./perror

fopen : No such file or diretory

strerror(返回錯(cuò)誤原因的描述字符串)

相關(guān)函數(shù)

perror

表頭文件

#include

定義函數(shù)

char * strerror(int errnum);

函數(shù)說明

strerror()用來依參數(shù)errnum的錯(cuò)誤代碼來查詢其錯(cuò)誤原因的描述字符串,然后將該字符串指針返回。

返回值

返回描述錯(cuò)誤原因的字符串指針。

范例

/* 顯示錯(cuò)誤代碼0 至9 的錯(cuò)誤原因描述*/

#include

main()

{

int i;

for(i=0;i<10;i++)

printf(“%d : %s\n”,i,strerror(i));

}

執(zhí)行

0 : Success

1 : Operation not permitted

2 : No such file or directory

3 : No such process

4 : Interrupted system call

5 : Input/output error

6 : Device not configured

7 : Argument list too long

8 : Exec format error

9 : Bad file descriptor

mkfifo(建立具名管道)

相關(guān)函數(shù)

pipe,popen,open,umask

表頭文件

#include

#include

定義函數(shù)

int mkfifo(const char * pathname,mode_t mode);

函數(shù)說明

mkfifo()會(huì)依參數(shù)pathname建立特殊的FIFO文件,該文件必須不存在,而參數(shù)mode為該文件的權(quán)限(mode%~umask),因此umask值也會(huì)影響到FIFO文件的權(quán)限。Mkfifo()建立的FIFO文件其他進(jìn)程都可以用讀寫一般文件的方式存取。當(dāng)使用open()來打開FIFO文件時(shí),O_NONBLOCK旗標(biāo)會(huì)有影響

1、當(dāng)使用O_NONBLOCK 旗標(biāo)時(shí),打開FIFO 文件來讀取的操作會(huì)立刻返回,但是若還沒有其他進(jìn)程打開FIFO 文件來讀取,則寫入的操作會(huì)返回ENXIO 錯(cuò)誤代碼。

2、沒有使用O_NONBLOCK 旗標(biāo)時(shí),打開FIFO 來讀取的操作會(huì)等到其他進(jìn)程打開FIFO文件來寫入才正常返回。同樣地,打開FIFO文件來寫入的操作會(huì)等到其他進(jìn)程打開FIFO 文件來讀取后才正常返回。

返回值

若成功則返回0,否則返回-1,錯(cuò)誤原因存于errno中。

錯(cuò)誤代碼

EACCESS 參數(shù)pathname所指定的目錄路徑無可執(zhí)行的權(quán)限

EEXIST 參數(shù)pathname所指定的文件已存在。

ENAMETOOLONG 參數(shù)pathname的路徑名稱太長。

ENOENT 參數(shù)pathname包含的目錄不存在

ENOSPC 文件系統(tǒng)的剩余空間不足

ENOTDIR 參數(shù)pathname路徑中的目錄存在但卻非真正的目錄。

EROFS 參數(shù)pathname指定的文件存在于只讀文件系統(tǒng)內(nèi)。

范例

#include

#include

#include

main()

{

char buffer[80];

int fd;

unlink(FIFO);

mkfifo(FIFO,0666);

if(fork()>0){

char s[ ] = “hello!\n”;

fd = open (FIFO,O_WRONLY);

write(fd,s,sizeof(s));

close(fd);

}

else{

fd= open(FIFO,O_RDONLY);

read(fd,buffer,80);

printf(“%s”,buffer);

close(fd);

}

}

執(zhí)行

hello!

pclose(關(guān)閉管道I/O)

相關(guān)函數(shù)

popen

表頭文件

#include

定義函數(shù)

int pclose(FILE * stream);

函數(shù)說明

pclose()用來關(guān)閉由popen所建立的管道及文件指針。參數(shù)stream為先前由popen()所返回的文件指針。

返回值

返回子進(jìn)程的結(jié)束狀態(tài)。如果有錯(cuò)誤則返回-1,錯(cuò)誤原因存于errno中。

錯(cuò)誤代碼

ECHILD pclose()無法取得子進(jìn)程的結(jié)束狀態(tài)。

范例

參考popen()。

pipe(建立管道)

相關(guān)函數(shù)

mkfifo,popen,read,write,fork

表頭文件

#include

定義函數(shù)

int pipe(int filedes[2]);

函數(shù)說明

pipe()會(huì)建立管道,并將文件描述詞由參數(shù)filedes數(shù)組返回。filedes[0]為管道里的讀取端,filedes[1]則為管道的寫入端。

返回值

若成功則返回零,否則返回-1,錯(cuò)誤原因存于errno中。

錯(cuò)誤代碼

EMFILE 進(jìn)程已用完文件描述詞最大量。

ENFILE 系統(tǒng)已無文件描述詞可用。

EFAULT 參數(shù)filedes數(shù)組地址不合法。

范例

/* 父進(jìn)程借管道將字符串“hello!\n”傳給子進(jìn)程并顯示*/

#include

main()

{

int filedes[2];

char buffer[80];

pipe(filedes);

if(fork()>0){

/* 父進(jìn)程*/

char s[ ] = “hello!\n”;

write(filedes[1],s,sizeof(s));

}

else{

/*子進(jìn)程*/

read(filedes[0],buffer,80);

printf(“%s”,buffer);

}

}

執(zhí)行

hello!

popen(建立管道I/O)

相關(guān)函數(shù)

pipe,mkfifo,pclose,fork,system,fopen

表頭文件

#include

定義函數(shù)

FILE * popen( const char * command,const char * type);

函數(shù)說明

popen()會(huì)調(diào)用fork()產(chǎn)生子進(jìn)程,然后從子進(jìn)程中調(diào)用/bin/sh -c來執(zhí)行參數(shù)command的指令。參數(shù)type可使用“r”代表讀取,“w”代表寫入。依照此type值,popen()會(huì)建立管道連到子進(jìn)程的標(biāo)準(zhǔn)輸出設(shè)備或標(biāo)準(zhǔn)輸入設(shè)備,然后返回一個(gè)文件指針。隨后進(jìn)程便可利用此文件指針來讀取子進(jìn)程的輸出設(shè)備或是寫入到子進(jìn)程的標(biāo)準(zhǔn)輸入設(shè)備中。此外,所有使用文件指針(FILE*)操作的函數(shù)也都可以使用,除了fclose()以外。

返回值

若成功則返回文件指針,否則返回NULL,錯(cuò)誤原因存于errno中。

錯(cuò)誤代碼

EINVAL參數(shù)type不合法。

注意事項(xiàng)

在編寫具SUID/SGID權(quán)限的程序時(shí)請盡量避免使用popen(),popen()會(huì)繼承環(huán)境變量,通過環(huán)境變量可能會(huì)造成系統(tǒng)安全的問題。

范例

#include

main()

{

FILE * fp;

char buffer[80];

fp=popen(“cat /etc/passwd”,”r”);

fgets(buffer,sizeof(buffer),fp);

printf(“%s”,buffer);

pclose(fp);

}

執(zhí)行

root :x:0 0: root: /root: /bin/bash

總結(jié)

以上是生活随笔為你收集整理的linux信号检查参数相同,linux信号函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。