問題タブ [ucontext]
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.
c++ - getcontext および setcontext に関する swapcontext の実装
私の理解が正しければ、swapcontext は、最初に oucp で getcontext を呼び出し、次に ucp で setcontext を呼び出すことと同じです。getcontext と setcontext を使用して swapcontext を実装する方法を確認しようとしています。
問題は、oucp のコンテキストが間違った行にあることです。次の行が setcontext(ucp) の次の行になるように getcontext を呼び出したいと考えています。ただし、 setcontext は返されないため、それはできません。さらに、この方法で swapcontext を実装すると、oucp と ucp に同じ引数を渡すとスタックしてしまいます。
これら 2 つの関数を使用して swapcontext を実装するにはどうすればよいでしょうか。それとも無理ですか?
c - getcontext システム コール (ucontext.h) は実際に何をしますか?
私は昨年、オペレーティング システムを取り上げました。その間、ユーザー コンテキスト ( header で定義) を使用ucontext.h
して、プロジェクトのスレッド スケジューラ (各スレッドがプロセスをシミュレートする) を実装しました。getcontext
私は講義に参加していて、ユーザー コンテキストについて話します。昨年このプロジェクトを行ったにもかかわらず、システム コールが実際に何をするのかがよくわからないことに気づきました。
のマニュアルページにgetcontext
は、
ucp が指す構造を現在アクティブなコンテキストに初期化します。」
また、 への引数についてsetcontext
、もし ucp 引数が
getcontext() の呼び出しによって取得された場合、プログラムの実行は、この呼び出しがちょうど戻ってきたかのように続行されます。
わかりました。
だからここに私が混乱しているものがあります。通常、私が学んだ方法では、コンテキストスイッチを実行するには、ucontext_t
構造体を初期化し、それを次のようにスワップ/設定します。
小さなプログラムで省略するgetcontext
と、何も面白いことはありません。ユーザーコンテキストを介したコンテキスト切り替えが多いやや大規模なプログラムでは、セグメンテーション違反が発生しますが、これは再度追加することによってのみ解決されgetcontext
ます。
正確には何をしgetcontext
ますか?構造体を割り当て、とフィールドをucontext_t
初期化して初期化し、なしで呼び出すことができないのはなぜですか? 実行しない必要な初期化はありますか?uc_stack
uc_sigmask
makecontext
getcontext
getcontext
makecontext
c - ユーザーレベルのスレッド ライブラリを実装していますが、コードでセグ フォールトが発生し続けています。その理由は何ですか?
タイトルが示すように、私のコードは残念ながらセグフォルトを続けています。私はすべてを正しくmallocしたと確信しており、私の関数は私が持っているテストケースに対して正しいと信じていますが、それでもセグフォールトです。誰かがセグフォルトの理由を見つけられるかどうかを見たかっただけですか? これが私がこれまでに持っている私のコードです:
テストケース
ヴァルグラインドの結果:
c - タイプ `stack_t` は Linux で定義されなくなりましたか?
Linux プラットフォームは Ubuntu 12.04 です。
ソースコードに次のヘッダーが含まれています。
ただし、コンパイルすると、文句を言います/usr/include/x86_64-linux-gnu/sys/ucontext.h:139:5: error: unknown type name 'stack_t'
stack_t
で定義する必要があることをグーグルで検索しましたsignal.h
が、ここでは定義されていないようです?
c - コンテキストの切り替え - ucontext_t と makecontext()
私は C プログラミングでコンテキスト切り替えを勉強していて、インターネットで次のサンプル コードを見つけました。makecontext()
関数だけが何かを実行する関数をトリガーできるかどうかを把握しようとしています。setcontext()
、getcontext()
、などの他の関数swapcontext()
は、コンテキストの設定に使用されます。
関数とそのmakecontext()
パラメータをコンテキストにアタッチします。変更がコミットされるまで、関数は常にコンテキストに固執しますか?
c - semaphore.h および ucontext.h でそのようなファイルは見つかりませんでした
私はここに私のコードを持っています:
そして、プロジェクトをビルドしようとするとError 1 error C1083: Cannot open include file: 'ucontext.h': No such file or directory
(およびsemaphore.hでも)得られます。
どうしてこれなの?どうすれば修正できますか?Windows マシンを使用しているという事実と関係がありますか?
ありがとうございました!
c - 警告: 'noreturn' 関数は戻ります
私はスレッド ライブラリを実行しています (uncontext.h でコンテキストを変更します)。私の関数は void 型で、返すことができません。しかし、戻らなくても、コンパイル時に次の警告が表示されます。
これは、関数の簡略化されたコードです (一部の詳細は省略)。
私はいつでも戻ってこないことに注意してください。しかし、gcc はこの警告を表示します。誰が何が問題なのか知っていますか?
c - C/Multithreading /Segmentation fault / (たぶん) スレッドのキューの問題
スレッド ライブラリを作成しようとしています。このために、実行する保留中のスレッドを格納するキューを実装しようとしています。
「MyThreadYield」関数から以下のコードを削除して実験しようとしたため、キューについて言及した理由は、正常に動作しますが、意図した機能を実行しません。
getcontext(&(save.context)); addToQueue(保存);
linux - getcontext と setjmp が glibc-x86-64 で異なるレジスタを保存するのはなぜですか?
ソースコードは次のとおりです: https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=sysdeps/unix/sysv/linux/x86_64/getcontext.S;hb=HEAD https:// sourceware.org/git/?p=glibc.git;a=blob_plain;f=sysdeps/x86_64/setjmp.S;hb=HEAD
ご覧のとおり、getcontext は浮動小数点コンテキストも保存し、r8 と r9 を登録しますが、setjmp は保存しません。これの理由は何ですか?