序文 低速システム コールとは、決して戻らない可能性があり、プロセスを永久にブロックするシステム コールを指します。たとえば、クライアント接続がない場合の accept と入力がない場合の read は、どちらも低速システム コールです。 Linux では、遅いシステム コールでブロックされたプロセスがシグナルをキャプチャすると、システム コールが中断され、代わりにシグナル処理関数が実行されます。これが中断されたシステム コールです。 ただし、信号処理機能が復帰すると、次のような状況が発生する可能性があります。
次に、システムコールが読み取りを選択し、割り込み信号が SIGALRM を選択し、アラームによって割り込み信号が生成される上記の状況をそれぞれ検証するコードを記述します。 信号の使用 #include <stdio.h> #include <signal.h> #include <unistd.h> #include <errno.h> void ハンドラ(int s) { printf("読み取りはシグナルハンドラによって中断されました\n"); 戻る; } int メイン() { char バッファ[10]; int nread = 0; シグナル(SIGALRM、ハンドラ); 警報(2); printf("読み取り開始\n"); nread = read(STDIN_FILENO、buf、sizeof(buf)); printf("読み取り戻り\n"); ((nread < 0) && (errno == EINTR))の場合 { printf("読み取り戻りに失敗しました。errno は EINTR\n"); } 0を返します。 } sigaction + default を使用する #include <stdio.h> #include <signal.h> #include <unistd.h> #include <errno.h> void ハンドラ(int s) { printf("読み取りはシグナルハンドラによって中断されました\n"); 戻る; } int メイン() { char バッファ[10]; int nread = 0; 構造体sigaction行為; sigemptyset(&act.sa_mask); act.sa_handler = ハンドラー; act.sa_flags = 0; //SIGALRM シグナルの SA_RESTART フラグを設定せず、sigaction のデフォルトの処理方法を使用します //act.sa_flag |= SA_INTERRUPT; //SA_INTERRUPT は sigaction のデフォルトの処理方法であり、中断されたシステム コールを自動的に再開しません。 //実際、act.sa_flags の値が何であっても、SA_RESTART が設定されていない限り、sigaction は SA_INTERRUPT に従って処理されます sigaction(SIGALRM, &act, NULL); 警報(2); printf("読み取り開始\n"); nread = read(STDIN_FILENO、buf、sizeof(buf)); printf("読み取り戻り\n"); ((nread < 0) && (errno == EINTR))の場合 { printf("読み取り戻りに失敗しました。errno は EINTR\n"); } 0を返します。 } sigactionを使用し、SA_RESTARTフラグを指定する #include <stdio.h> #include <signal.h> #include <unistd.h> #include <errno.h> void ハンドラ(int s) { printf("読み取りはシグナルハンドラによって中断されました\n"); 戻る; } int メイン() { char バッファ[10]; int nread = 0; 構造体sigaction行為; sigemptyset(&act.sa_mask); act.sa_handler = ハンドラー; act.sa_flags = 0; act.sa_flags |= SA_RESTART; //SIGALRM シグナルの SA_RESTART フラグを設定します。sigaction(SIGALRM, &act, NULL); 警報(2); printf("読み取り開始\n"); nread = read(STDIN_FILENO、buf、sizeof(buf)); printf("読み取り戻り\n"); ((nread < 0) && (errno == EINTR))の場合 { printf("読み取り戻りに失敗しました。errno は EINTR\n"); } 0を返します。 } 中断されたシステム コールの処理方法の違いにより、アプリケーションの中断されたシステム コールに関連する問題は次のとおりです。
int nread = read(fd, buf, 1024); (nread < 0)の場合 { (エラー番号 == EINTR)の場合 { // 読み取りが中断されましたが、これは失敗とはみなされません。読み取りの呼び出しを書き換えたり、無視したりするなど、実際のニーズに応じて処理できます。} それ以外 { //実際の読み取りエラーを読み取る} } 要約する 以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。 以下もご興味があるかもしれません:
|
<<: MySQL 構成 SSL マスタースレーブ レプリケーション
>>: React antdはフォームの動的な増減を実現します
MySQL のフィルタリングのタイミングは、集計関数で使用される where 条件と having ...
環境: 1 CentOS Linux リリース 7.5.1804 (コア)ファイアウォールと sel...
序文lvm (論理ボリューム マネージャー) 論理ボリューム管理は、Linux システムのニーズを満...
数年前、Taobaoのモバイル版の左下隅に面白い丸いボタンがあったことを覚えています。それをクリック...
mysqldump コマンドはじめに: データベースバックアッププログラム形式: mysqldum...
Vueのシンプルなタイマーを参考にしてください。具体的な内容は以下のとおりです原理: setInte...
概要: MySQL JDBC 抽出にはどのような方法を使用すればよいでしょうか? その方法を説明しま...
良い画像素材のウェブサイトを見つけるのは難しいです。特に無料です。良い写真には非常に目を引く視覚効果...
NFS の紹介NFS (ネットワーク ファイル システム) は、FreeBSD でサポートされている...
目次イベント駆動型とパブリッシュ・サブスクライブ型ブラウザの JavaScript ではイベント駆動...
目次1. 背景建築問題現象2. 分析プロセス接続プール不安に陥る雲を晴らして光を見よう3. 解決策I...
目次連合テーブルの初期化ステートメントの実行連合の結果ユニオンオールグループ化十分なメモリステートメ...
セキュアターミナルMobaXterm_Personalをダウンロードまず、安全なターミナルをダウンロ...
フォーラムで、ネットユーザーの jeanjean20 が、Marquee を標準に適合させる方法につ...
過去の Linux イメージに関する問題を修正従来の Linux イメージで作成された ECS クラ...