[解決済み] Linuxで共有メモリを使用する方法(C言語
質問
あるプロジェクトでちょっとした問題があります。
での共有メモリの使用について、きちんと文書化された例を見つけようとしています。
fork()
が、うまくいきません。
基本的にシナリオは、ユーザーがプログラムを開始したときに、私は共有メモリに2つの値を格納する必要があるということです。 カレントパス というもので、これは char* と ファイル名 であり、これも char* .
コマンドの引数に応じて、新しいプロセスがキックオフされ
fork()
を読み込んで変更する必要があります。
カレントパス
という変数が共有メモリに格納され、その間に
ファイル名
変数は読み取り専用です。
共有メモリに関する良いチュートリアルで、サンプルコード(可能であれば)があるものはありますか?
どのように解決するのですか?
2つのアプローチがあります。
shmget
と
mmap
. についてお話します。
mmap
の方がよりモダンで柔軟性があるからです。
man shmget
(
またはこのチュートリアル
を使用したい場合は、旧式のツールを使用してください。
は
mmap()
関数は、アクセスやパーミッションを制御するための高度にカスタマイズ可能なパラメータを持つメモリバッファを割り当て、必要に応じてファイルシステムのストレージでバックアップするために使用することができます。
次の関数は、プロセスが子プロセスと共有できるインメモリバッファを作成します。
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
void* create_shared_memory(size_t size) {
// Our memory buffer will be readable and writable:
int protection = PROT_READ | PROT_WRITE;
// The buffer will be shared (meaning other processes can access it), but
// anonymous (meaning third-party processes cannot obtain an address for it),
// so only this process and its children will be able to use it:
int visibility = MAP_SHARED | MAP_ANONYMOUS;
// The remaining parameters to `mmap()` are not important for this use case,
// but the manpage for `mmap` explains their purpose.
return mmap(NULL, size, protection, visibility, -1, 0);
}
上で定義した関数を使って、バッファを確保するプログラム例を以下に示します。親プロセスはメッセージを書き、フォークし、そして子プロセスがバッファを変更するのを待ちます。どちらのプロセスも共有メモリの読み書きが可能です。
#include <string.h>
#include <unistd.h>
int main() {
char parent_message[] = "hello"; // parent process will write this message
char child_message[] = "goodbye"; // child process will then write this one
void* shmem = create_shared_memory(128);
memcpy(shmem, parent_message, sizeof(parent_message));
int pid = fork();
if (pid == 0) {
printf("Child read: %s\n", shmem);
memcpy(shmem, child_message, sizeof(child_message));
printf("Child wrote: %s\n", shmem);
} else {
printf("Parent read: %s\n", shmem);
sleep(1);
printf("After 1s, parent read: %s\n", shmem);
}
}
関連
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] Xcode - 警告。C99 では関数の暗黙の宣言は無効です。
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] ワイルドカードマッチングに基づいて、現在のフォルダとサブフォルダ内のすべてのファイルを再帰的に検索するにはどうすればよいですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] Linux で grep を使ってファイル名だけを表示するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[C] レポートエラー 代入の左オペランドとしてlvalueが必要
-
エラー: 宣言されていない識別子 'bool' の使用と C コンパイラでの問題点
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] 配列のすべてのメンバーを同じ値で初期化するには?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] C言語でファイルが存在するかどうかを確認する最も良い方法は何ですか?
-
[解決済み] ストラクチャーとユニオンの違い
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する
-
[解決済み] C言語で "unsigned long "をprintfする方法は?
-
[解決済み] 2次元配列の反復処理において、ループの順序がパフォーマンスに影響するのはなぜですか?