linuxのSA_RESTART信号

1747 ワード

SA_RESTART信号は、私がプログラムを実行している間にreadの現在のstdIN_のような現在のプログラムがブロック状態にあることに作用します.FILENO端末入力時この時点でプログラムはブロック状態で入力文字列を待っていますがkill命令で現在のプログラムに送信するとこのread関数ブロック状態が突然中断されerrnoがEINTRに割り当てられ、このシステム呼び出しreadが返されます-1はエラーを表し、すぐにプログラムabort割り込みプログラムの実行を終了します
この理由は、私が信号を送信するときに現在のプロセスがブロックされているため、現在のread関数がまだ実行済みではありません.突然1つの信号が来たら、私はすぐに信号処理を実行しなければならないのではないでしょうか.そして、私のこの伝送の信号は遮断されていないので、現在のプログラムは現在のreadというシステム呼び出し関数から飛び出して直接実行信号処理関数(信号送信)を実行します.問題は、信号処理が完了すると、まだ実行されていないシステム呼び出しが実行されるということではないでしょうか.なぜ突然システムが異常終了するのかというと、システムが信号を実行したときに現在のシステム呼び出しを実行し続けるときにデフォルトで-1 errno付与EINTR終了プログラムを返すので、プログラムが異常終了することがあるので、この遅いシステムの問題を解決するために、現在入力されている信号を信号シールドでブロックし、sigpendingを通じて未決信号を取得することができます.その後、現在の信号処理関数が実行されてからシステム呼び出しが実行されますが、この方法は適切ではありません.システム内部で信号を送信し、送信するほど、リアルタイム性が求められると思います.そのため、この方法は適切ではありません.flags賦課SA_RESTARTこれは現在のプロセスが実行されていないシステム呼び出し関数readをデフォルトで返すことはありません-1異常終了ネット上の多くの公式用語は実はぼやけています以下の例を見てくださいこれは簡単で古典的なプログラムが異常に終了しないのは私が信号処理の信号構造体sigactionのsa_flagsはSA_を割り当てたRESTART
#include #include #include #include #include #include void sig_echo(int signum) { if(signum==SIGUSR1) {
	printf("SIGUSR1 recieve!
"); } else if(signum==SIGUSR2) { printf("SIGUSR2 recieve!
"); } printf("noSIG
");

} int main(int argc,char* argv[]) {
struct sigaction sig;
sig.sa_flags=SA_RESTART;
sig.sa_handler=sig_echo;
char buf[1024];
memset(buf,0,sizeof(buf));
sigaction(SIGUSR1,&sig,NULL);
sigaction(SIGUSR2,&sig,NULL);
while(1)
{
	memset(buf,0,sizeof(buf));
	if(read(STDIN_FILENO,buf,sizeof(buf))<0)
	{
		if(errno=EINTR)
		{
			exit(EXIT_FILURE);
			printf("exit error");
		}
	}
	else{
		
		printf("%s
",buf); } } return 0;

}