問題タブ [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.

0 投票する
2 に答える
366 参照

c - POSIX/SUS ヘッダーの型定義

この質問は、POSIX/SUS 標準の必須ヘッダーで定義する必要があるさまざまな型に関するものです。

いくつかのタイプは、多くのヘッダー ファイルで定義する必要があります。これを実現するための正しい方法と準拠した方法は何か疑問に思っています。

たとえば、<time.h>ヘッダーの仕様を見てください。

ヘッダーを含めると、 <signal.h> ヘッダーからのすべてのシンボルが表示される場合があります。

これは簡単で、<signal.h>から含まれてい<time.h>ます。

さて、これはどうですか:

<sys/types.h> で説明されているように、clock_tsize_ttime_tclockid_t、および timer_tタイプを定義する必要があります。

私が理解しているように、必要以上のシンボルが公開されるため、単純に<sys/types.h>fromを含めることはできません。<time.h>

誰でもこれを確認できますか?
を含めると標準準拠に違反します<sys/types.h>か?

もしそうなら、最良の解決策は、各タイプに特定のヘッダーを作成することだと思います。そうすれば、他のシンボルを気にせずに、特定のタイプをどこからでも見えるようにすることができます。
他に良い解決策はありますか?

最後に、C 標準の型についてはどうでしょうか。
POSIX/SUS 仕様の型の多くは整数型であり、固定幅が必要になる場合があります。

<stdint.h>では、標準が特定のヘッダーからインクルードすることは問題ないのでしょうか?それともコンプライアンスに違反するのでしょうか?

0 投票する
1 に答える
553 参照

c - CプログラミングでXMPP経由でsshを実装する方法は?

リモートシェルを呼び出すxmppボットをLinuxで作成しています。このプログラムを書くために、どのテクノロジーについて知っておくべきかを教えてくれる人はいますか?

0 投票する
4 に答える
15950 参照

multithreading - 単一のソケットまたはパイプで poll() または select() を実行する複数のスレッド

複数のスレッドが単一のソケットまたはパイプハンドルで同時に実行poll()または呼び出しを行う状況について、POSIX およびその他の標準は何と言っていますか?select()

データが到着した場合、待機中のスレッドの 1 つだけが起動されるのか、それとも待機中のすべてのスレッドが起動されるのか?

0 投票する
1 に答える
112 参照

c++ - SuSv3 データ型の極値を移植可能にチェックする方法は?

SuSv3 ではssize_t、符号付き整数型である必要があります。計算した値がそのようなデータ型に許可されている最大値よりも大きいかどうかを確認したい場合は、それを と比較できますがINT_MAX、これは良くありません。

この比較を行うことができるより移植性の高い方法はありますか - 次のようfに 機能するマクロ/関数

、または同じソートへのそのような操作の短いシーケンス?

システム:
Ubuntu 12.04。
glibc 2.15
カーネル 3.2.0

PS: これをグーグルで調べたとき、gcc 拡張機能の「typeof」が有望だと最初に思いました。しかし、ここでは役に立たないようです(または役に立ちますか?)。これは、gcc 拡張機能/属性/その他の可能性があるものは何でも問題ないと言うことです。

0 投票する
1 に答える
67 参照

c - すべての POSIX/SUS シグナルが #define であるというのは、与えられたものですか、それとも仮定ですか?

信号は実装によって異なります。APUE (Unix 環境での高度なプログラミング) には、第 2 版の 292 ページの「図 10.1 UNIX システム シグナル」など、いくつかの優れた表があります。

それでは、模範的なSIGWAITING. シグナルはドキュメントでは として表示されますintが、ほとんどの実装では#defineではなくを使用しているようですconst int

#defineしかし、標準は、信号がdであることに依存できることをどこでも規定していますか? または、事実上すべての既存の実装が#define. それとも、これはまったく悪い仮定ですか?

#define理論的根拠は次のとおりです。使用されることに依存できる場合、それを使用#ifdefしない実装からよりエキゾチックなシグナルを隠すために使用できます。定数名についてconst intは、このコンパイル時の決定を可能にする同様のメカニズムを知りません。

0 投票する
1 に答える
235 参照

c - dup2 の後で stdio ストリームが正しいファイル記述子を指していると仮定できますか?

コードが問題を引き起こした場合に親に影響を与えず、親が報告できるように、特定のコードをフォークされた子にカプセル化するコードがあります。

私は電話execの後ではありません。fork単純forkに、通常は親で実行されるコードが実行されます。

子のコードは、 と に出力しstdoutますstderr。出力のインターリーブとstdioバッファリングに問題があるため、より良い解決策を求めてTLPIを検討していました。

私が思いついたアイデアは、おおよそ次のとおりです。

  • pipe()ストリームごとに
  • fork()
  • 子で:
    • close()パイプの終わりを読む
    • dup2()stdoutおよびstderrそれぞれのファイル記述子への書き込みが終了します
    • setbuf(fd, NULL)stdio子内のストリーム バッファリングをオフにします。
  • 親で:
    • close()パイプの端を書く
    • select/ pselect/ epolletc(Linux、BSD、AIX、Solarisなどで実行する必要があります)を使用して、新しいデータのパイプの読み取り端を監視し、それがwrite()親プロセスのそれぞれのファイル記述子に直接到着したとき。

さて、私は子供dup2の中で と の間に 1 つのステップが欠けていると思います。setbufそれは何ですか?

setbufFILE*当然のことですが、にdup2作用しintます。

freopen頭に浮かびましたが、それにはパスが必要です。新しい fileno をストリームに割り当てたいだけの場合は、どうすればよいですか?

0 投票する
2 に答える
105 参照

c - 親プロセスと子プロセスの間でstdioバッファリングに使用されるバッファを共有することは合法ですか?

stdio ストリーム バッファリング用にバッファを割り当て、それをsetvbuf(前にfork) 使用することが合法であるかどうか疑問に思っていました。ここで、バッファは匿名であり、mmap親プロセスと子プロセスの間で共有されるメモリの「割り当てられた」部分ですか?

2 つが同期していると仮定して、結果が正気であると仮定してもよいでしょうか、それともこれを何としても避けるべきでしょうか?

0 投票する
0 に答える
1975 参照

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()内の子の終了コードを返すことです。intpstatus

外側のdo-whileループインは、呼び出しで使用するhandle_child_output()を設定します。これは、シグナル パイプの read-end と、子からのandパイプの read-ends を追加します。FD_SETselectstderrstdout

次に、if(FD_ISSET(fds[SIG_PIPE], &rd))シグナル パイプに新しいものが含まれているかどうかを確認し、それを排出して、潜在的なシグナルを処理します。

その後のforループは、残りのファイル記述子をループして、保留中のものがあるかどうかを確認し、親のそれぞれのstdioチャネルで取得したものをオウム返しして処理します。

その 2 番目のループの読み取り呼び出しは、停止する場所です。

症状は、親が読み取り呼び出しでスタックしていることです。

信号パイプと他のパイプの読み取りの間に競合状態があるかのようです。ファイル記述子が検査されるまでに、子プロセスはすでに終了しているように見え、その結果、最終的にゾンビにread()なりwait()ます。

私は何を間違っていますか?外側のループから抜け出すためにループのif(exitloop) break;前に追加することは合法でしょうか? これにより、未読のコンテンツがパイプに残る可能性があるように思えますね。fordowhile


0 投票する
2 に答える
684 参照

linux - FUSE の書き込みシーケンス保証

write() の実装はランダム アクセスを想定する必要がありますか?それとも、順番に実行され、オフセットが増加するなど、いくつかの想定があるのでしょうか?

VFS インターフェースを説明する POSIX または SUS 仕様の一部へのリンクには、追加のポイントが与えられます。