問題タブ [sus]
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 - POSIX/SUS ヘッダーの型定義
この質問は、POSIX/SUS 標準の必須ヘッダーで定義する必要があるさまざまな型に関するものです。
いくつかのタイプは、多くのヘッダー ファイルで定義する必要があります。これを実現するための正しい方法と準拠した方法は何か疑問に思っています。
たとえば、<time.h>
ヘッダーの仕様を見てください。
ヘッダーを含めると、 <signal.h> ヘッダーからのすべてのシンボルが表示される場合があります。
これは簡単で、<signal.h>
から含まれてい<time.h>
ます。
さて、これはどうですか:
<sys/types.h> で説明されているように、clock_t、size_t、time_t、clockid_t、および timer_tタイプを定義する必要があります。
私が理解しているように、必要以上のシンボルが公開されるため、単純に<sys/types.h>
fromを含めることはできません。<time.h>
誰でもこれを確認できますか?
を含めると標準準拠に違反します<sys/types.h>
か?
もしそうなら、最良の解決策は、各タイプに特定のヘッダーを作成することだと思います。そうすれば、他のシンボルを気にせずに、特定のタイプをどこからでも見えるようにすることができます。
他に良い解決策はありますか?
最後に、C 標準の型についてはどうでしょうか。
POSIX/SUS 仕様の型の多くは整数型であり、固定幅が必要になる場合があります。
<stdint.h>
では、標準が特定のヘッダーからインクルードすることは問題ないのでしょうか?それともコンプライアンスに違反するのでしょうか?
c - CプログラミングでXMPP経由でsshを実装する方法は?
リモートシェルを呼び出すxmppボットをLinuxで作成しています。このプログラムを書くために、どのテクノロジーについて知っておくべきかを教えてくれる人はいますか?
multithreading - 単一のソケットまたはパイプで poll() または select() を実行する複数のスレッド
複数のスレッドが単一のソケットまたはパイプハンドルで同時に実行poll()
または呼び出しを行う状況について、POSIX およびその他の標準は何と言っていますか?select()
データが到着した場合、待機中のスレッドの 1 つだけが起動されるのか、それとも待機中のすべてのスレッドが起動されるのか?
c++ - SuSv3 データ型の極値を移植可能にチェックする方法は?
SuSv3 ではssize_t
、符号付き整数型である必要があります。計算した値がそのようなデータ型に許可されている最大値よりも大きいかどうかを確認したい場合は、それを と比較できますがINT_MAX
、これは良くありません。
この比較を行うことができるより移植性の高い方法はありますか - 次のようf
に 機能するマクロ/関数
、または同じソートへのそのような操作の短いシーケンス?
システム:
Ubuntu 12.04。
glibc 2.15
カーネル 3.2.0
PS: これをグーグルで調べたとき、gcc 拡張機能の「typeof」が有望だと最初に思いました。しかし、ここでは役に立たないようです(または役に立ちますか?)。これは、gcc 拡張機能/属性/その他の可能性があるものは何でも問題ないと言うことです。
c - すべての POSIX/SUS シグナルが #define であるというのは、与えられたものですか、それとも仮定ですか?
信号は実装によって異なります。APUE (Unix 環境での高度なプログラミング) には、第 2 版の 292 ページの「図 10.1 UNIX システム シグナル」など、いくつかの優れた表があります。
それでは、模範的なSIGWAITING
. シグナルはドキュメントでは として表示されますint
が、ほとんどの実装では#define
ではなくを使用しているようですconst int
。
#define
しかし、標準は、信号がdであることに依存できることをどこでも規定していますか? または、事実上すべての既存の実装が#define
. それとも、これはまったく悪い仮定ですか?
#define
理論的根拠は次のとおりです。使用されることに依存できる場合、それを使用#ifdef
しない実装からよりエキゾチックなシグナルを隠すために使用できます。定数名についてconst int
は、このコンパイル時の決定を可能にする同様のメカニズムを知りません。
c - dup2 の後で stdio ストリームが正しいファイル記述子を指していると仮定できますか?
コードが問題を引き起こした場合に親に影響を与えず、親が報告できるように、特定のコードをフォークされた子にカプセル化するコードがあります。
私は電話exec
の後ではありません。fork
単純fork
に、通常は親で実行されるコードが実行されます。
子のコードは、 と に出力しstdout
ますstderr
。出力のインターリーブとstdio
バッファリングに問題があるため、より良い解決策を求めてTLPIを検討していました。
私が思いついたアイデアは、おおよそ次のとおりです。
pipe()
ストリームごとにfork()
- 子で:
close()
パイプの終わりを読むdup2()
stdout
およびstderr
それぞれのファイル記述子への書き込みが終了しますsetbuf(fd, NULL)
stdio
子内のストリーム バッファリングをオフにします。
- 親で:
close()
パイプの端を書くselect
/pselect
/epoll
etc(Linux、BSD、AIX、Solarisなどで実行する必要があります)を使用して、新しいデータのパイプの読み取り端を監視し、それがwrite()
親プロセスのそれぞれのファイル記述子に直接到着したとき。
さて、私は子供dup2
の中で と の間に 1 つのステップが欠けていると思います。setbuf
それは何ですか?
setbuf
FILE*
当然のことですが、にdup2
作用しint
ます。
freopen
頭に浮かびましたが、それにはパスが必要です。新しい fileno をストリームに割り当てたいだけの場合は、どうすればよいですか?
c - 親プロセスと子プロセスの間でstdioバッファリングに使用されるバッファを共有することは合法ですか?
stdio ストリーム バッファリング用にバッファを割り当て、それをsetvbuf
(前にfork
) 使用することが合法であるかどうか疑問に思っていました。ここで、バッファは匿名であり、mmap
親プロセスと子プロセスの間で共有されるメモリの「割り当てられた」部分ですか?
2 つが同期していると仮定して、結果が正気であると仮定してもよいでしょうか、それともこれを何としても避けるべきでしょうか?
c - セルフパイプを使用して、イベント ループが read() でストールするのを回避するにはどうすればよいですか?
セルフパイプトリックを利用して、アプリケーションの移植可能な実装 (Solaris、MacOSX、Linux、BSD 間) を取得しようとしています。
stderr
したがって、フォークされた子の出力をフェッチするために使用しているとの 2 つのパイプに加えてstdout
(子では no を使用exec
し、子は親と同じコードを実行します)、シグナル用のパイプがあります (enum {SIG_PIPE, STDOUT_PIPE, STDERR_PIPE, MAX_PIPE}
シンボリックを提供します)。名前)。
O_NONBLOCK
を呼び出す前にパイプに設定されhandle_child_output()
ます。stderr
子にはandパイプの書き込み終了があり、 and のフレンドstdout
を使用し続けprintf()
、それぞれのパイプに効果的に書き込みます (setvbuf
は子内のバッファリングをオフにするために使用されます)。
以下のコードは、一般的なセルフパイプ トリックと同様に、少し長くなります。それはすでに凝縮された形です。それでは、何が起こるべきか、どこで行き詰まるかを説明してみましょう。
終了ステータスを収集する必要があり、子プロセスがシグナルで終了したか終了したかを確認できる必要があります。これらの条件の処理は別の場所で行われます。関連するのは、指している byhandle_child_output()
内の子の終了コードを返すことです。int
pstatus
外側のdo
-while
ループインは、呼び出しで使用するhandle_child_output()
を設定します。これは、シグナル パイプの read-end と、子からのandパイプの read-ends を追加します。FD_SET
select
stderr
stdout
次に、if(FD_ISSET(fds[SIG_PIPE], &rd))
シグナル パイプに新しいものが含まれているかどうかを確認し、それを排出して、潜在的なシグナルを処理します。
その後のfor
ループは、残りのファイル記述子をループして、保留中のものがあるかどうかを確認し、親のそれぞれのstdio
チャネルで取得したものをオウム返しして処理します。
その 2 番目のループの読み取り呼び出しは、停止する場所です。
症状は、親が読み取り呼び出しでスタックしていることです。
信号パイプと他のパイプの読み取りの間に競合状態があるかのようです。ファイル記述子が検査されるまでに、子プロセスはすでに終了しているように見え、その結果、最終的にゾンビにread()
なりwait()
ます。
私は何を間違っていますか?外側のループから抜け出すためにループのif(exitloop) break;
前に追加することは合法でしょうか? これにより、未読のコンテンツがパイプに残る可能性があるように思えますね。for
do
while
linux - FUSE の書き込みシーケンス保証
write() の実装はランダム アクセスを想定する必要がありますか?それとも、順番に実行され、オフセットが増加するなど、いくつかの想定があるのでしょうか?
VFS インターフェースを説明する POSIX または SUS 仕様の一部へのリンクには、追加のポイントが与えられます。