Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> LinuxシステムFAQ >> Linux-MySleep関数の実装と競合状態

Linux-MySleep関数の実装と競合状態

  
(1)関数実装の全体的な枠組み
1>使用する必要がある関数のインタフェース2>実装の全体的なプロセスのアイデア3>プログラムは起こりうる状況の分析を実行します4>最適化結果そして解決策(b)3つの主要な関数インターフェース

システムの内部スリープ機能に従って、その実行プロセスを知ることによって、あなたはalarm()関数、pause()関数とsigaction()関数を使うことができます。実現しました。
関数のパラメータと戻り値

追加のテーブルマークダウン構文:
関数名
パラメータ
戻り値
alarm()unsigned int Secondsは0またはシグナル応答の後の残り時間を返すpause()エラー戻り値sigaction()のみを無効にする(int signo、const struct sigaction * restrict act、struct sigaction * restrict oact)ここでの研究はありません。sigaction構造

構造体sigaction {void(* sa_handler)(int); void(sa_sigaction)(int、siginfo_t、void *); sigset_t sa_mask; int sa_flags; void(* sa_restorer)(void);}シグナルハンドラはvoid(sa_handler)を使用できます。 (int)またはvoid(* sa_sigaction)(int、siginfo_t、void)。どちらを使用するかは、sa_flagsでSA_SIGINFOビットが設定されているかどうかによって異なります。設定されている場合は、void(* sa_sigaction)(int、siginfo_t、void *)を使用してください。 )(int)、シグナルの値は現時点でハンドラにのみ送信できます。 Sa_handlerこのパラメータは、新しいシグナル処理関数を表すsignal()のパラメータハンドラと同じですが、それ以外の意味についてはsignal()を参照してください。 sa_maskは、sa_maskで指定されたシグナルセットを、このシグナルの処理中に一時的に保留にするように設定するために使用されます。 Sa_restorerこのパラメータは使用されていません。 Sa_flagsは、信号処理に関連する他の操作を設定するために使用されます。 Sa_flagsは他のフラグを設定することもできます。SA_RESETHAND:シグナルハンドラが呼び出されたとき、シグナルハンドラをデフォルト値にリセットします。SIG_DFL SA_RESTART:シグナルがプロセスのシステムコールを中断すると、システムは自動的にシステムコールSA_NODEFERを開始します。一般的に、シグナルハンドラが実行されているとき、カーネルは与えられたシグナルをブロックします。ただし、SA_NODEFERフラグが設定されていると、シグナルハンドラが実行されているときにカーネルはシグナルをブロックしません。
mysleep実装コード
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31#include #include void myhandler(int sig){} int mysleep(int timeout){struct sigaction act、oact; act .sa_handler = myhandler; sigemptyset(& act.sa_mask); Act.sa_flags = 0; sigaction(SIGALRM、& act、&oact); alarm(タイムアウト); pause(); int ret = alarm(0); sigaction(SIGALRM、& oact、NULL); return ret; } int main(){while(1){printf( "mysleep start ... \\ n"); mysleep(3); printf( "mysleep success \\ n");} return 0;}< /signal .h>< /stdio.h>実行手順

1)main関数がmysleep関数を呼び出します。 mysleep関数は、SIGALRMシグナル用のハンドラー関数myhandlerを登録するためにsigactionを呼び出します。ここでのmyhandler関数は何もしませんが、SIGALRMシグナルのデフォルトの処理はプロセスを終了することであるため、それを減らすことはできません。 2)アラームを設定するためにalarm(timeout)を呼び出します。 3)pauseを呼び出して待つと、カーネルは別のプロセスに切り替わります。 4)タイムアウト秒後に、アラームが期限切れになり、カーネルがプロセスにSIGALRMを送信します。 5)プロセスのユーザー状態がカーネル状態から戻る前に、保留シグナルが処理され、SIGALRMシグナルが検出され、処理機能はmyhandlerです。 6)ユーザーモードに切り替えてmyhandler機能を実行するmyhandler機能に入ると自動的にSIGALRM信号がマスクされ、myhandler機能から戻ると自動的にSIGALRM信号がマスク解除されます。その後、システムコールsigreturnを自動的に実行して再度カーネルに入り、実行状態を継続するためにユーザ状態のメイン制御フローに戻ります。つまり、メイン関数はmysleep関数を呼び出します。

Copyright © Windowsの知識 All Rights Reserved