2 つの関数を定義し、1 つが奇数を出力し、もう 1 つが偶数を出力するプログラムを作成しようとしています。プログラムは一定時間関数を実行し、アラーム信号を受信すると、現在の関数のコンテキストを保存した後、2 番目の関数の実行を開始します。次のアラーム信号を受信すると、最後に保存されたコンテキストから最初の関数の実行を再開します。
これには関数 getcontext と swapcontext を使用しました。
これが私のコードです:
#include<stdio.h>
#include<signal.h>
#include<ucontext.h>
ucontext_t c1, c2, cmain;
int switch_context = 0, first_call = 1;
void handler(int k)
{
switch_context = 1;
}
void nextEven()
{
int i;
for(i = 0; ; i += 2)
{
if(switch_context)
{
alarm(2);
switch_context = 0;
if(first_call)
{
first_call = 0;
swapcontext(&c1, &cmain);
}
else
{
swapcontext(&c1, &c2);
}
}
printf("even:%d\n", i);
sleep(1);
}
}
void nextOdd()
{
int j;
for(j = 1; ; j += 2)
{
if(switch_context)
{
alarm(2);
switch_context = 0;
if(first_call)
{
first_call = 0;
swapcontext(&c2, &cmain);
}
else
{
swapcontext(&c2, &c1);
}
}
printf("odd:%d\n", j);
sleep(1);
}
}
int main()
{
signal(SIGALRM, handler);
alarm(2);
getcontext(&cmain);
if(first_call) nextOdd();
nextEven();
}
私が受け取った出力は次のとおりです。
odd:1
odd:3
even:0
even:2
odd:4
odd:6
even:8
even:10
odd:12
毎回コンテキストを復元しているのに、関数 nextEven() の値を出力しているのはなぜですか?