、swapcontextのmanページhereに例を見て、これはその出力です:
$ ./a.out
main: swapcontext(&uctx_main, &uctx_func2)
func2: started
func2: swapcontext(&uctx_func2, &uctx_func1)
func1: started
func1: swapcontext(&uctx_func1, &uctx_func2)
func2: returning
func1: returning
main: exiting
だから、あなたはそれが非常になんとかです見ることができるように。
注:タイマーシグナルハンドラ内でコンテキストをスワップする場合は、自分自身に先制スケジューラがありますが、安全かどうかはわかりません。
編集:私はそれがシグナルハンドラ内でコンテキストを切り替えることが可能だということを示唆しては、sigactionのmanページでこれを見つけた:
SA_SIGINFOがsa_flagsに指定されている場合は、sa_sigactionの(代わりに はsa_handlerの) signumのシグナル処理関数を指定します。 この関数は、シグナル番号を第1引数として受け取り、第2引数としてsiginfo_tへのポインタ と、第3引数として ucontext_t(void *にキャスト)へのポインタを受け取ります。
「Cで」実行できないため、割り当てが少し難しいです。新しい実行コンテキストの作成を容易にし、それらの間で切り替えるには、最低限のアセンブリまたは同等のコンパイラ拡張が必要です。あるいは、あなた自身の完全な仮想マシンとCの実装を仮想マシン上で実行するように書くこともできますが、これはあなたのインストラクターが心に留めているものだとは思わないでしょう... –
協調マルチタスク/スレッド化の場合、getcontext/makecontext /便利なsetcontext関数。 – MetallicPriest
これは、レジスタコンテキストとスタックポインタの保存/復元を実装するために、何らかのアセンブラがなければ、これがどのように実行されるかわかりません。それはI/Oとそれを待つ方法を考えることさえありません。 –