私はこのテスト CGI プログラムを C で書きました。
int main(int argc, char *argv[])
{
sem_t *mysem;
mysem = sem_open("/MyClient", O_CREAT | O_EXCL, S_IRUSR | S_IWUSR, 10);
if(mysem == SEM_FAILED)
{
// already running
if(errno == EEXIST)
{
fprintf(stdout, "Content-type:text/plain\n\n");
fprintf(stdout, "Already running");
exit(1);
}
else
{
fprintf(stdout, "[error] - ", errno);
exit(1);
}
}
fprintf(stdout, "Content-type:text/plain\n\n");
int i = 0;
for(;i <10; i++)
{
sleep(1);
}
fprintf(stdout, "all done by PID - %d\n", getpid());
sem_unlink("MyClient");
sem_close(mysem);
return 0;
}
Web サーバーに Apache を使用しています。ブラウザで「localhost/cgi-bin/mycgi」に移動したとき(同時に2つのタブを開きます)。
出力は次のようになります (予想)
(Tab1 の場合) 「すべて PID によって行われました - 8186」
および(Tab2の場合)「すでに実行中」
しかし、私はこれを取得します(実際)
(Tab1 の場合) 「すべて PID によって行われました - 8186」
および(Tab2の場合)「すべてPIDによって行われた-8187」
端末でプログラム (2 つのインスタンス) を実行すると、上記のコードは期待どおりに動作します。