問題タブ [system-calls]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - マルチスレッド (クローンを使用) プログラムでのセグメンテーション違反のデバッグ
いくつかのスレッドを作成するコードを書きました。スレッドの 1 つが終了するたびに、新しいスレッドが作成されて置き換えられます。pthreads を使用して非常に多数のスレッド (>450) を作成できなかったため、代わりに clone システム コールを使用しました。(このように膨大な数のスレッドを持つことの意味を認識していることに注意してください。ただし、このプログラムはシステムに負荷をかけることのみを目的としています)。
clone() は、子スレッドのスタック領域をパラメーターとして指定する必要があるため、スレッドごとに必要なスタック領域のチャンクを割り当て、スレッドが終了すると解放します。スレッドが終了したら、親にシグナルを送信して、同じことを通知します。
コードを以下に示します。
いくつかの配列を使用して、子プロセスのpidとスタック領域のベースアドレスを追跡しました(解放するため)。
このプログラムを実行すると、しばらくすると終了します。gdb で実行すると、スレッドの 1 つが SIGSEGV (セグメンテーション違反) を取得したことがわかります。しかし、場所はわかりません。出力は次のようになります。
次のコマンドラインを使用して、valgrind で実行してみました。
しかし、valgrind の下では問題なく実行され続けます。
このプログラムをデバッグする方法がわかりません。これは何らかのスタック オーバーフローか何かではないかと感じましたが、スタック サイズを増やしても (最大 74KB)、問題は解決しませんでした。
私の唯一の質問は、セグメンテーション違反の理由と場所、またはこのプログラムをデバッグする方法です。
c - sysenterではなくシステムコールにgccがintを使用するように強制するにはどうすればよいですか?
sysenterではなく、すべてのシステムコールに対してgcc use int命令を強制することは可能ですか?この質問は奇妙に聞こえるかもしれませんが、PythonやFirefoxなどのいくつかのプロジェクトをこの方法でコンパイルする必要があります。
概要
jbcreixのおかげで、glibc 2.9のソースコードをダウンロードし、sysdeps / unix / sysv / linux / i386 / sysdep.hの行を変更して、によるsysenterの使用を無効にしました#undef I386_USE_SYSENTER。
c - Windows は Linux の先読みシステムコールに相当しますか?
Linux の先読みシステムコールに相当する Windows はありますか?
編集:
可能であれば、同等のオフセット/カウント パラメーター (または下限/上限) を示す完全な関数シグネチャが必要です。
例: Linux 関数のシグネチャは次のとおりです。
その使用例は
ここで、「file」は、mmap などの関数によって以前に設定されたファイル記述子です。この呼び出しは、インデックス 100 で 500 バイトを読み取ります。
編集 2: readahead が何をするかわからない場合は、これを読んでください: http://linux.die.net/man/2/readahead
linux - Linux アプリケーションの syscall アクセスを制限する
foobar2 つの異なる操作モードを持つLinux バイナリを想定します。
- モード A: syscalls
a、bおよびcが使用される行儀の良いモード。 - モード B: syscall
a、b、cおよびdが使用される、問題が発生したモード。
syscallおよびsyscall は無害ですがa、syscallは潜在的に危険であり、マシンを不安定にする可能性があります。bcd
さらに、アプリケーションが実行する 2 つのモードのどちらがランダムであると仮定します。アプリケーションは、モード A で 95 % の確率で実行され、モード B で 5 % の確率で実行されます。アプリケーションにはソースコードが含まれていないため、変更することはできず、そのまま実行するだけです。
アプリケーションが syscall を実行できないようにしたいd。syscall を実行するdと、結果は NOOP またはアプリケーションの即時終了のいずれかになります。
Linux 環境でそれを実現するにはどうすればよいですか?
linux - クローン スレッドでの Linux 仮想タイマーの動作
私は次のことをしました:
- 繰り返しトリガーする仮想タイマーを作成します。
- SIGVTALRM のシグナルハンドラをインストールする
- clone syscall を呼び出す
- 複製されたスレッドが別の CPU で実行されるように sched_affinity を設定します。
複製されたスレッドも SIGVTALRM をリッスンしますか? では、SIGVTALRM がトリガーされたときに、両方のスレッドがシグナル ハンドラーを呼び出すのでしょうか? また、新しいスレッドを作成した後、メインスレッドのシグナルハンドラに影響を与えることなく、SIGVTALRM のシグナルハンドラを別の関数に変更できますか?
clone() に渡されるフラグに依存していると思います。主に、CLONE_SIGHAND と SIGCHLD を使用しています。他のフラグにも依存しますか?
c - ファイルはrootユーザーのみが開くことができます。間違った権限が与えられていると思います。
私のプログラムは基本的に、コマンドライン引数を使用して実行可能ファイルを実行します。子プロセスがフォークされ、子プロセスの出力がファイル「filename」に取り込まれます。
問題は、ファイルが作成され、データが書き込まれるが、rootユーザーのみが開くことができることです。プログラムを呼び出したユーザーがファイルを読み取れるようにするにはどうすればよいですか。
コードは次のとおりです。
unix - ファイルがディレクトリかどうかをテストするクロスプラットフォームの方法
現在、次のようなコードがあります(凝縮され、一連のエラーチェックが削除されました):
これは、私の Linux マシンで問題なく動作します。ただし、別のマシン (SunOS、sparc のように見えます) では:
コンパイル時に次のエラーが発生します。
dirent.h ヘッダーはクロスプラットフォーム (POSIX マシン用)だと思いました。助言がありますか。
fork - フォークシステムコールの後、下位レベルで何が起こりますか?
私はfork()がより高いレベルで何をするかを知っています。私が知りたいのはこれです-
フォーク呼び出しがあるとすぐに、トラップ命令が続き、制御がジャンプしてフォーク「ハンドラー」を実行します。さて、別のアドレス空間とプロセス制御ブロックを作成して親プロセスを複製することにより、子プロセスを作成するこのハンドラーは、各プロセスに1つずつ、2つの値をどのように返しますか?
実行のどの時点で、フォークは2つの値を返しますか?
簡単に言えば、フォークコールの後に下位レベルで発生するステップバイステップのイベントを誰かが説明できますか?
c - select()可能タイマー
select()は優れたシステムコールです。ファイル記述子、ソケット記述子、パイプなどをいくつでもパックして、入力が利用可能になったときに同期的に通知を受け取ることができます。
インターバル/ワンショットタイマーを作成してselect()で使用する方法はありますか?これにより、IOとタイミングに複数のスレッドを使用する必要がなくなります。
linux - システムコール番号とシステムコールハンドラポインタの競合
オペレーティング システムの概念 (7e、Silberschatz、Galvin、Gagne) を読んでいたときに、Linux カーネルにシステム コールを追加するという研究プロジェクトに出会いました。その本はそう言っている
Linux カーネルの最近のバージョンのシステム コール番号は、/usr/src/linux-2.x/include/asm-i386/unistd.h にリストされています。(たとえば、ファイル記述子を閉じるために呼び出されるシステム コール close() に対応する __NR_close は、値 6 として定義されます。) /usr/src/linux-2.x/arc/i386/kernel/entry見出し ENTRY(sys_call_table) の下の .S。unistd.h ファイルで定義されているシステム コール番号と一致するように、sys_close がテーブルの 6 番目のエントリに格納されていることに注意してください。(75ページ)
ubuntu リポジトリから最新の Linux ソース パッケージをダウンロードしたところ、上記のソース ファイルのディレクトリとファイル名がわずかに変更されていることがわかりました。しかし、ファイル /usr/src/linux-source-2.6.31/arch/x86/kernel/less syscall_table_32.S で私を混乱させる興味深いことがあります。sys_close は本で述べたように 6 番のエントリに格納されていますが、それでも、 unistd.h ファイルで __NR_close が 6 ではなく 57 として定義されています。この違いの理由は何ですか?
前もって感謝します