タグ付けされた質問 「portability」

2
SO_REUSEADDRとSO_REUSEPORTの違いは何ですか?
man pagesソケットオプションのプログラマドキュメンテーションSO_REUSEADDRとはSO_REUSEPORT異なるオペレーティングシステムごとに異なると、多くの場合、非常に混乱しています。一部のオペレーティングシステムには、オプションさえありませんSO_REUSEPORT。WEBはこの主題に関する矛盾する情報でいっぱいであり、多くの場合、特定のオペレーティングシステムの1つのソケット実装にのみ当てはまる情報を見つけることができます。 では、正確にはどのようにSO_REUSEADDR違うのですSO_REUSEPORTか? SO_REUSEPORT制限のないシステムはありますか? また、異なるオペレーティングシステムでどちらかを使用した場合、予想される動作は正確には何ですか?

12
Pythonで現在のユーザー名を取得するポータブルな方法はありますか?
現在のユーザーのユーザー名をPythonで取得するポータブルな方法はありますか(つまり、少なくともLinuxとWindowsの両方で機能する方法)。それは次のように機能しos.getuidます: >>> os.getuid() 42 >>> os.getusername() 'slartibartfast' 私はぐるぐる回って決定的な答えを見つけられなかったことに驚きました(おそらく、私はただひたすらググっていたかもしれませんが)。PWDのモジュールは、たとえば、Linuxがこの下を達成するための比較的簡単な方法を提供していますが、それはWindows上で存在しません。一部の検索結果では、Windowsでのユーザー名の取得が特定の状況(Windowsサービスとして実行されている場合など)で複雑になる可能性があることが示唆されましたが、確認はしていません。

8
glibcのstrlenをすばやく実行するには、なぜ複雑にする必要があるのですか?
ここでstrlenコードを調べていて、コードで使用されている最適化が本当に必要かどうか疑問に思っていましたか?たとえば、次のようなものが同等以上に機能しないのはなぜですか? unsigned long strlen(char s[]) { unsigned long i; for (i = 0; s[i] != '\0'; i++) continue; return i; } より単純なコードは、コンパイラーが最適化するのに優れていたり、簡単だったりしませんか? strlenリンクの背後にあるページのコードは次のようになります。 /* Copyright (C) 1991, 1993, 1997, 2000, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Torbjorn Granlund (tege@sics.se), with …


9
Windows(Visual C)のunistd.hに代わるものはありますか?
Unix用に書かれた比較的単純なコンソールプログラムをWindowsプラットフォーム(Visual C ++ 8.0)に移植しています。すべてのソースファイルには、存在しない "unistd.h"が含まれています。それを削除すると、「ランダム」、「ランダム」、および「getopt」のプロトタイプが欠落しているという不満が出ます。私はランダム関数を置き換えることができることを知っています、そして私はgetopt実装を見つけたりハックアップしたりできると確信しています。 しかし、他の人も同じ課題に直面していると思います。私の質問は、「unistd.h」のWindowsへの移植はありますか?少なくとも1つは、ネイティブWindows実装を備えた関数を含みます-パイプやフォークは必要ありません。 編集: 私が必要とするものの置き換えを含む、非常に独自の "unistd.h"を作成できることを知っています。これは、限定セットであるため、特にこの場合です。しかし、それは一般的な問題のように思われるので、誰かが機能のより大きなサブセットのためにすでに作業を行っているのではないかと思っていました。 職場では別のコンパイラや環境に切り替えることはできません-Visual Studioに行き詰まっています。
165 c++  c  windows  portability  unistd.h 



23
C / C ++で人々が行う不当な仮定を実証するための教育ツールには何が含まれていますか?
初心者(および中級)プログラマーがC、C ++およびそれらのプラットフォームでの不当な前提を認識して挑戦するのに役立つ、SOのための小さな教育ツールを準備したいと思います。 例: 「整数は回り込む」 「誰もがASCIIを持っている」 「関数ポインタをvoid *に格納できます」 小さなテストプログラムをさまざまなプラットフォームで実行できると考えました。これは、SOでの経験から、多くの未経験/半経験主流の開発者が作成した「もっともらしい」仮定を実行し、さまざまなマシンでそれらが壊れる方法を記録しています。 これの目標は、何かをするのが「安全」であることを証明することではありません(実行することは不可能であり、テストが壊れた場合にのみ何でも証明します)代わりに、最も理解していない個人に最も目立たない表現を示す未定義または実装定義の動作がある場合は、別のマシンで中断します。。 これを達成するために私はあなたに尋ねたいと思います: このアイデアをどのように改善できますか? どのテストが適切で、どのように見えるべきですか? 手に入れて結果を投稿できるプラットフォームでテストを実行して、プラットフォームのデータベースを作成します。どのように違い、なぜこの違いが許容されるのでしょうか。 テストおもちゃの現在のバージョンは次のとおりです。 #include <stdio.h> #include <limits.h> #include <stdlib.h> #include <stddef.h> int count=0; int total=0; void expect(const char *info, const char *expr) { printf("..%s\n but '%s' is false.\n",info,expr); fflush(stdout); count++; } #define EXPECT(INFO,EXPR) if (total++,!(EXPR)) expect(INFO,#EXPR) /* stack check..How …

8
CMAKEのOS固有の手順:方法
私はCMAKEの初心者です。以下は、mingw環境ウィンドウでうまく機能する単純なcmakeファイルです。問題は明らかにtarget_link_libraries()、libwsock32.aをリンクしているCMAKEの機能にあります。Windowsではこれが機能し、結果が得られます。 ただし、予想通り、Linuxでは、Linux OSにはないもの/usr/bin/ldを探します-lwsock32。 私の問題は、Linux OSでwsock32ライブラリをリンクしないようにCMAKEにどのように指示するのですか? どんな助けでも大歓迎です。 私のシンプルなCMakeファイル: PROJECT(biourl) set (${PROJECT_NAME}_headers ./BioSocketAddress.h ./BioSocketBase.h ./BioSocketBuffer.h ./BioSocketCommon.h ./BioSocketListener.h ./BioSocketPrivate.h ./BioSocketStream.h ./BioUrl.h BioDatabase.h ) set (${PROJECT_NAME}_sources BioSocketAddress.C BioSocketBase.C BioSocketCommon.C BioSocketStream.C BioUrl.C BioDatabase.C ) add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_headers} ${${PROJECT_NAME}_sources} ) # linkers #find_library(ws NAMES wsock32 PATHS ${PROJECT_SOURCE_DIR} NO_SYSTEM_ENVIRONMENT_PATH NO_DEFAULT_PATH) target_link_libraries(${PROJECT_NAME} bioutils wsock32) install (TARGETS ${PROJECT_NAME} RUNTIME …
108 c++  linux  cmake  mingw  portability 

9
一部のプラットフォームではchar **を使用し、他のプラットフォームではconst char **を使用するC ++関数を移植可能に呼び出すにはどうすればよいですか?
私のLinux(およびOS X)マシンでは、iconv()関数には次のプロトタイプがあります。 size_t iconv (iconv_t, char **inbuf... FreeBSDでは、次のようになります。 size_t iconv (iconv_t, const char **inbuf... C ++コードを両方のプラットフォームでビルドしたいと思います。Cコンパイラでchar**は、const char**パラメータに(またはその逆に)を渡すと、通常、単なる警告が発生します。ただし、C ++では致命的なエラーです。したがって、を渡した場合char**、BSDでコンパイルされません。渡した場合const char**、Linux / OS Xでコンパイルされません。プラットフォームを検出せずに、両方でコンパイルするコードを作成するにはどうすればよいですか? 私が持っていた1つの(失敗した)アイデアは、ヘッダーによって提供されたものをオーバーライドするローカルプロトタイプを提供することでした。 void myfunc(void) { size_t iconv (iconv_t, char **inbuf); iconv(foo, ptr); } これは、iconvCリンケージが必要なために失敗extern "C"し、関数内に配置することはできません(なぜでしょうか) 私が思いついた最良のアイデアは、関数ポインタ自体をキャストすることです。 typedef void (*func_t)(iconv_t, const char **); ((func_t)(iconv))(foo, ptr); しかし、これは他のより深刻なエラーを隠す可能性があります。
91 c++  const  portability 

4
最新のC ++の実験的な機能は、長期的なプロジェクトに対して信頼できますか?
現在C ++ 11/14を使用しているプロジェクトがstd::filesystemありますが、C ++ 17でのみ使用可能なのようなものが必要であるため、現在使用する機会がありません。ただし、現在のコンパイラではstd::experimental::filesystem。として使用できるようです。将来、次のようなものを追加できると仮定して、実験的な機能を使用することをお勧めしますか? #ifdef CXX17 //if this is C++17 std::filesystem::something ...; #else std::experimental::filesystem::something ...; #endif 私の懸念は次のとおりです。 1.すべての準拠コンパイラが同じ実験機能を備えていることが保証されていますか? 2.実験的な機能は、信頼性を低下させる大きな変更が発生する傾向がありますか? たぶん、疑問に思うことがもっとあります。なぜそれらを使用する必要があるのですか、または使用しないのですか?私は新しいプロジェクトに戸惑い、何を決めるのかわかりません。

3
「揮発性」は、マルチコアシステムのポータブルCコードで何かを保証しますか?
見た後、束 の 他の 質問 と その 回答を、私はという印象を得るCで「揮発性」というキーワードが正確に何を意味するのかには広範な合意はありませんが。 標準自体でさえ、誰もがそれが何を意味するのかについて合意するのに十分明確ではないようです。 他の問題の中で: それはあなたのハードウェアとあなたのコンパイラに依存して異なる保証を提供するようです。 コンパイラの最適化には影響しますが、ハードウェアの最適化には影響しません。そのため、独自のランタイム最適化を行う高度なプロセッサでは、コンパイラが防止したい最適化を防止できるかどうかさえ明確ではありません。(一部のコンパイラーは、一部のシステムで一部のハードウェア最適化を防止するために命令を生成しますが、これは決して標準化されていないようです。) 問題を要約すると、「大量に読み取った後」「揮発性」が次のようなことを保証しているように見えます。値は、レジスタからだけでなく、少なくともコアのL1キャッシュにも、同じ順序で読み書きされます。読み取り/書き込みがコードに表示されます。しかし、これは役に立たないようです。レジスタからの読み取り/レジスタへの書き込みは同じスレッド内ですでに十分ですが、L1キャッシュとの調整は、他のスレッドとの調整に関してそれ以上何も保証しません。L1キャッシュとだけ同期することがいつ重要になるかは想像できません。 USE 1 揮発性の広く合意された使用は、ライトを(直接、ハードウェアで)制御するメモリ内のビットのように、特定のメモリ位置がI / O機能にハードウェアでマッピングされている古いシステムまたは組み込みシステムであるようです、またはキーボードのキーが押されているかどうかを通知するメモリ内のビット(ハードウェアによって直接キーに接続されているため)。 と思われる「利用1」とは、そのターゲットのマルチコアシステムを含んポータブルなコードでは発生しません。 USE 2 「use 1」とそれほど変わらないのは、割り込みハンドラー(ライトの制御やキーからの情報の保存など)によっていつでも読み書きできるメモリです。しかし、すでにこのため、システムによっては、割り込みハンドラが 独自のメモリキャッシュを備えた別のコアで実行される可能性があり、「揮発性」はすべてのシステムでキャッシュの一貫性を保証しないという問題があります。 したがって、「use 2」は「volatile」が提供できる範囲を超えているようです。 USE 3 他に議論の余地のない唯一の用途は、コンパイラーが認識しない同じメモリーを指している同じメモリーを指すさまざまな変数を介したアクセスの誤最適化を防ぐことです。しかし、人々がそれについて話していないので、これはおそらく議論の余地がないだけです-私はそれについての言及を1つだけ見ました。また、C標準では、「異なる」ポインター(関数への異なる引数など)が同じ項目または近くの項目を指す可能性があることをすでに認識しており、コンパイラーがそのような場合でも機能するコードを生成する必要があることをすでに指定しています。しかし、私はこのトピックを最新(500ページ)の標準ですぐに見つけることができませんでした。 では「use 3」はまったく存在しないのでしょうか。 したがって、私の質問: 「揮発性」は、マルチコアシステムのポータブルCコードで何かを保証しますか? 編集-更新 最新の標準を参照した後、答えは少なくとも非常に制限されているように見えます: 1.標準は、特定のタイプ "volatile sig_atomic_t"の特別な扱いを繰り返し指定しています。ただし、この規格では、マルチスレッドプログラムでシグナル関数を使用すると、未定義の動作が発生することも規定されています。したがって、この使用例は、シングルスレッドプログラムとそのシグナルハンドラ間の通信に限定されているようです。 2.この規格では、setjmp / longjmpに関連する「揮発性」の明確な意味も規定されています。(重要なコードの例は、他の質問と回答に記載されています。) したがって、より正確な質問は次のようになります 。「揮発性」は、(1)シングルスレッドプログラムがシグナルハンドラから情報を受信できるようにする、または(2)setjmpを許可することを除いて、マルチコアシステムのポータブルCコードで何でも保証しますかsetjmpとlongjmpの間で変更された変数を表示するコード? これははい/いいえの質問です。 「はい」の場合、「揮発性」が省略された場合にバグになるバグのないポータブルコードの例を示すことができればすばらしいでしょう。「いいえ」の場合、マルチコアターゲットの場合、これら2つの非常に特殊なケース以外では、コンパイラーは「揮発性」を無視してもかまいません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.