/*
 *	signal.h
 *
 *	シグナル
 *
 *	* Tue Jun 14 22:14:51 JST 2016 Naoyuki Sawa
 *	- 1st リリース。
 *	- P/ECE開発環境にはsignal.hが含まれていないので、signal.hを新規作成しました。
 *	  signal.hが必要になった理由は、「Lua 5.3.3」がsignal.hに依存するようになったからです。
 *	  「Lua 5.3.3」がsignal.hに依存している理由は、sig_atomic_tの型定義を参照するためだけです。
 *	  signal()関数等には依存していないので、関数は最小限の「SysVシグナルシステムコール」だけを宣言する事にしました。
 *	  「SysVシグナルシステムコール」については、下記のページを参照させて頂きました。
 *	  □参照資料:「Super Technique 講座 - シグナルとコールバック」(http://www.nurs.or.jp/~sug/soft/super/signal.htm)
 *	  「POSIXシグナルシステムコール」(sigaction()等)は、宣言していません。
 *	  もし今後「POSIXシグナルシステムコール」が必要になったら、その時に宣言を追加する予定です。
 */
#ifndef __SIGNAL_H__
#define __SIGNAL_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/*****************************************************************************
 *	シグナル番号
 *****************************************************************************/
//□「Linux Programmer's Manual - SIGNAL」(https://linuxjm.osdn.jp/html/LDP_man-pages/man7/signal.7.html)より引用:
//POSIX.1-1990に定義されているシグナル
//	シグナル		値		//動作		コメント
#define SIGHUP			1		//Term		制御端末のハングアップ検出,又は,制御しているプロセスの終了
#define SIGINT			2		//Term		キーボードからの割り込み
#define SIGQUIT			3		//Core		キーボードによる中止
#define SIGILL			4		//Core		不正な命令
#define SIGABRT			6		//Core		abort()からの中断シグナル
#define SIGFPE			8		//Core		浮動小数点例外
#define SIGKILL			9		//Term		Killシグナル
#define SIGSEGV			11		//Core		不正なメモリー参照
#define SIGPIPE			13		//Term		パイプ破壊(読み手の無いパイプへの書き出し)
#define SIGALRM			14		//Term		alarm()からのタイマーシグナル
#define SIGTERM			15		//Term		終了シグナル
#define SIGUSR1			10		//Term		ユーザー定義シグナル1
#define SIGUSR2			12		//Term		ユーザー定義シグナル2
#define SIGCHLD			17		//Ign		子プロセスの一時停止,又は,終了
#define SIGCONT			18		//Cont		一時停止からの再開
#define SIGSTOP			19		//Stop		プロセスの一時停止
#define SIGTSTP			20		//Stop		端末より入力された一時停止
#define SIGTTIN			21		//Stop		バックグランドプロセスの端末入力
#define SIGTTOU			22		//Stop		バックグランドプロセスの端末出力
//POSIX.1-1990標準にはないが、SUSv2とPOSIX.1-2001に記述されているシグナル
//	シグナル		値		//動作		コメント
#define SIGBUS			7		//Core		バスエラー(不正なメモリーアクセス)
#define SIGPOLL			SIGIO		//Term		ポーリング可能なイベント。SIGIOと同義		(SysV)
#define SIGPROF			27		//Term		Profilingタイマーの時間切れ
#define SIGSYS			31		//Core		ルーチンへの引き数が不正			(SVr4)
#define SIGTRAP			5		//Core		トレース/ブレークポイントトラップ
#define SIGURG			23		//Ign		ソケットの緊急事態				(4.2BSD)
#define SIGVTALRM		26		//Term		仮想アラームクロック				(4.2BSD)
#define SIGXCPU			24		//Core		CPU時間制限超過					(4.2BSD)
#define SIGXFSZ			25		//Core		ファイルサイズ制限の超過			(4.2BSD)
//その他の各種シグナル
//	シグナル		値		//動作		コメント
#define SIGIOT			SIGABRT		//Core		IOTトラップ。SIGABRTと同義
//#define SIGEMT		-		//Term		
#define SIGSTKFLT		16		//A		数値演算プロセッサにおけるスタックフォルト	(未使用)
#define SIGIO			29		//Term		入出力が可能になった				(4.2BSD)
#define SIGCLD			SIGCHLD		//Ign		SIGCHLDと同義
#define SIGPWR			30		//Term		電源喪失					(SysV)
#define SIGINFO			SIGPWR		//Term		SIGPWRと同義
//#define SIGLOST		-		//Term		ファイルロックが失われた			(未使用)
#define SIGWINCH		28		//Ign		ウィンドウリサイズシグナル			(4.3BSD,Sun)
#define SIGUNUSED		SIGSYS		//Core		SIGSYSと同義
/*****************************************************************************
 *	
 *****************************************************************************/
// * Tue Jun 14 22:14:51 JST 2016 Naoyuki Sawa
// - 本当は、pid_tの定義は/clip/include/sys/types.hだけで行いたかったのですが、止むを得ない理由により/clip/include/signal.hでも定義する事にしました。
//   止むを得ない理由とは、Lua 5.3.3のlstate.hが<sys/types.h>をインクルードせずにsignal.hをインクルードしており、pid_tの定義前にsignal.hのkill()関数宣言がpid_tを参照してしまうからです。
//   その問題を回避するために、signal.hがインクルードされた時点でpid_tが未定義ならば、signal.hでもpid_tを定義するようにしました。
// - pid_tが未定義かどうかを判断する方法は、_PID_Tマクロを使って判断するようにしました。
//   このような目的に使うマクロ名としては、'__pid_t_defined'(glibc)や'HAVE_PID_T'(Minix)等の流儀も有るようですが、
//   今回は、Appleのソース(http://opensource.apple.com/source/xnu/xnu-3248.20.55/bsd/sys/_types/_pid_t.h)に倣って'_PID_T'にしました。
#ifndef _PID_T
#define _PID_T
typedef int pid_t;
#endif//_PID_T
typedef int sig_atomic_t;
typedef void (*sighandler_t)(int); 
/*---------------------------------------------------------------------------*/
//signal error value (returned by signal call on error)
#define SIG_ERR		((sighandler_t)-1)	//Error return.
//signal action codes
#define SIG_DFL		((sighandler_t) 0)	//Default action.
#define SIG_IGN		((sighandler_t) 1)	//Ignore signal.
/*---------------------------------------------------------------------------*/
sighandler_t signal(int signum, sighandler_t sighandler);
int kill(pid_t pid, int sig);
int raise(int sig);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__SIGNAL_H__
