従来の POSIX では、errno
は単に整数の左辺値であり、 で完全にうまく機能しますがfork
、明らかにスレッドではほとんどうまく機能しません。pthreads によるerrno
と、スレッド ローカルの整数左辺値です。Linux/NTPL では、実装の詳細として、errno は「整数の左辺値を返す関数に展開されるマクロ」です。
私の Debian システムでは のようですが*__errno_location ()
、他のシステムでは&(gettib()->errnum
.
TL;DRスレッドを作成したことがある
と仮定すると、呼び出して、それが機能することを期待できますか、それとも特別なレイン ダンスを実行する必要がありますか? たとえば、スレッド情報ブロックの特別なフィールドや特別な TLS 値を読み取る必要がありますか? あるいは、glibc が何らかの方法でエラー値を格納するスレッドローカル変数のアドレスを設定する必要がありますか? もしかしてみたいな?clone
errno
__set_errno_location()
それとも「そのまま」でいいのでしょうか?
必然的に、誰かが「単に phtreads を使ってください」と答えたくなりますが、そうしないでください。pthreads は使いたくありません。欲しいclone
。私は、pthreads の不適切な機能を望んでいません。また、pthreads の特異な動作に対処したくありません。それらの特異な動作を実装するためのオーバーヘッドも必要ありません。pthread の欠点の多くは、30 年近く前の完全に壊れたシステムで機能しなければならない(そして、驚くべきことに、正常に機能する) 必要があるという事実から来ていることを認識していますが、それはそれがそうであるという意味ではありません。誰にとっても、あらゆる状況にとって、必然的に良いことです。この場合、移植性は問題になりません。
この特定の状況で私が望むのは、親と同じアドレス空間で実行されている別のプロセスを起動し、単純なロック (futex など) を介して同期し、適切にwrite
動作することです (つまり、正しく読み取ることができる必要があります)errno
。 . オーバーヘッドをできるだけ少なくし、他の機能や特別な動作を必要とせず、必要とさえしません。