信号のセットは何ですか?
信号処理機能を実行する信号を受信した後、同じ信号は再び、次に信号は、信号処理機能の実行中にブロックされる場合は、信号処理機能は、最後まで、その応答信号が遮断された実行しました次に、複数の信号を処理し、信号を受信し、信号が周期をブロックしている場合、その音符が主にマージされ
、それらがSIGUSR1信号を受信する場合にSIGUSR1シグナルハンドラを、実行される例は、信号が遮断され、信号処理機能を実行した後まで、機能が再び実行されます。ブロック中とSIGUSER1信号を受信した場合、唯一のSIGUSR1シグナルハンドラが再び呼ばれます
信号は、信号を受信し、現在のレコードを設定するために使用され、その後、信号が待ってブロックされ、信号を受信するために、この時点であれば、「処理」などの現在の位置をマークする信号
Linuxでは、セットを示すデータ型sigset_t信号このタイプは、信号のLinuxのタイプ32として定義される32ビットの符号なし整数で、1に設定した場合は、プロセスが表されるフラグの各信号を32ビットの符号なし整数変数であります0に設定されている場合、この信号は、信号を処理することができることを示しています。注:一部のオペレーティングシステム、信号の数が32以上であるが、この時点では使用できないが集まっ32ビット整数信号を示しています
機能操作信号セット
関数のプロトタイプは次のよう:[1]
#include <signal.h>
// @brief 清空信号集,全部位置0
int sigemptyset(sigset_t *set);
// 全部位置1
int sigfillset(sigset_t *set);
// 将signo信号对应位置1
int sigaddset(sigset_t *set, int signum);
// 将signo信号对应位置0
int sigdelset(sigset_t *set, int signum);
// 判断该信号集中是否包含指定的信号
int sigismember(const sigset_t *set, int signum);
再び信号の組、信号処理受信一般セットフィルタの信号の影響
使用sigemptysetセット()(信号のセットの全ての位置0)の場合、初期化信号は、その後、すべての信号を受信することができる
(使用sigfillset場合)セット初期化信号(信号のセットは、全ての位置1)は、全て、この場合の信号は、もちろん、およびSIGKILL信号をマスキングSIGQUITが遮蔽されていない
sigaddset()とsigdelset()信号によって特徴付けられることを意味するか、マスクを指定する信号を受信します
sigprocmask機能
この関数は、次の関数プロトタイプ、(マスク文字信号のセットとして信号を使用して)現在のプロセスを遮蔽ワード信号を検出し、修正するために使用されている[2]
/*
* @param how 如何修改当前信号屏蔽字
* SIG_SETMASK: 直接将第二个参数的信号集进行关联
* SIG_BLOCK: 当前要设置的信号集与进程目前关联的信号集取并集
* SIG_UNBLOCK: 取交集
* @param newSet 要关联的信号集,如果newSet是个空指针(表示只是要获取当前进程的进程屏蔽字),此时how的值无意义
* @param oldSet 存放当前进程的信号屏蔽字
* @return 执行成功返回0,否则返回-1
*/
int sigpromask(int how, const sigset_t* newSet, sigset_t *oldSet);
注:は、sigprocmask()はとpthread_sigmaskを使用してマルチスレッド処理のためのみのシングルスレッドプロセス環境で使用されている
例:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h> // exit
#include <unistd.h> // sleep
void sig_quit(int signo){
printf("收到了SIGQUIT信号!\n");
}
int main(){
signal(SIGQUIT, sig_quit); // 注册SIGQUIT信号处理函数,SIGQUIT信号可以通过Ctrl+\触发
sigset_t newSet, oldSet; // 定义两个信号集变量
sigemptyset(&newSet); // 清空信号集,全部位置0
sigaddset(&newSet, SIGQUIT); // 将SIGQUIT对应的位置1,表示要屏蔽SIGQUIT信号
sigprocmask(SIG_BLOCK, &newSet, &oldSet);
printf("进程关联的信号集设置为newSet\n");
if(sigismember(&newSet, SIGQUIT)){
printf("SIGQUIT信号被屏蔽了,按ctrl+\\测试\n");
}
printf("sleep 10s\n");
sleep(10);
printf("sleep end\n");
sigprocmask(SIG_SETMASK, &oldSet, NULL);
printf("进程关联的信号集重新设置为oldSet,SIGQUIT信号没有被屏蔽,按ctrl+\\测试\n");
printf("sleep 10s\n");
sleep(10);
return 0;
}
sigaction関数
この機能は、ビューに使用してシグナルハンドラを設定しています。なぜなら、互換性問題の信号機能の代わりに、信号関数を使用して、実際の開発は、sigaction関数ので。関数のプロトタイプは次のよう:[3]
#include <signal.h>
/*
* @param signum: 指定要查看和设置的哪个信号的处理函数
* @param act: 如果非空,表示修改信号的处理函数
* @param oact: 如果非空,可以通过该参数得到信号之前的处理函数
* @return 成功返回0,否则返回-1
*/
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int); // 信号处理函数地址,或者SIG_IGN、SIG_DFL
void (*sa_sigaction)(int, siginfo_t *, void *); // 替代的信号处理函数,如果sa_flags为SA_SIGINFO则执行该处理函数
sigset_t sa_mask; // 执行信号处理函数时的信号屏蔽字
int sa_flags; // 选项
void (*sa_restorer)(void); // The sa_restorer field is not intended for application use
};
サンプルコードを総称関数sigsuspendへの導入に与えられています
sigsuspend機能
ウエイト信号ブロックは、次の関数プロトタイプ生じるようこの関数は、単に理解することができる。[4]
#include <signal.h>
/*
* @param mask:先将mask替换当前进程的信号屏蔽字,之后阻塞进程等待信号发生
* @return 总是返回-1,可以通过errno值判断是否出错,正常情况errno为EINTR
*/
int sigsuspend(const sigset_t *mask);
例:
#include <stdio.h> // printf
#include <string.h> // memset
#include <signal.h> // signal
void handler_sigusr1(int sig){
printf("收到了SIGUSR1信号\n");
}
int main(){
sigset_t set;
sigemptyset(&set);
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = handler_sigusr1;
act.sa_mask = set;
if(sigaction(SIGUSR1, &act, NULL) < 0){
perror("sigaction error");
}
while(1){
sigsuspend(&set);
}
return 0;
}
はじめに、これらの機能の目的は、ブログの参照、シグナル伝達機構C ++パッケージを使用する方法を簡単に、シグナリングメカニズムの知識寝具パッケージを作ることであるシグナリングメカニズムパッケージを
リファレンス
- [1]。Linuxのman-ページ:男3 sigemptyset
- [2]。Linuxのman-ページ:男2は、sigprocmask
- [3]。Linuxのman-ページ:男2のsigaction
- [4]。Linuxのman-ページ:男2 sigsuspend