2017-11-05 14 views
0

私はLinuxでコーディングしており、別のプログラムを実行していくつかのタスクを実行しようとしています。mmapをCのexecve関数に渡すには?

マスターは、いくつかの入力ファイル(スレーブごとに1ファイル)で何らかの単語検索を行うためにスレーブを実行する必要があります。 すべての検索が完了した後、マスターはスレーブプロセスで見つかったマッチメント行を出力ファイルに書き込みます。私は名前付き共有メモリを使ってマスターとスレーブ間の通信をしようとしています。

私のmmapコールのポインタをマスタのメインに渡して他のプログラムに渡す必要がありますが、その型が一致しないためにできません。

シンクロナイズにセマフォを使用する場合は、共有セマフォのmmapも渡す必要があります。スレーブを実行するには、発信者のmainのコードスニペットがあります。私は奴隷メインでARGVを使ってnewArgvに到達することができます:あなたはexecve -ed実行可能にmmapを渡すことはできません

int f = open(argv[1], O_RDWR); 

unsigned int *addr = mmap(0, 10000, PROT_READ | PROT_WRITE, MAP_SHARED, f, 0); 

char * newArgv[10]; 
for (int a = 0; a < numberOfFiles; a++) { 
    newArgv[0] = wordToSearch; 
    newArgv[1] = argv[3 + a]; 
    char * path = "./psearch2aslave"; 
    execve(path, newArgv, NULL); 
} 
+1

ポインタを渡さないでください。同じポインタではありません。あなたが適切なOSの本を手に入れ、そのIPCの章を読んだら、匿名のmmapはどのプロセス間でもIPCをサポートしないと言います。実際のファイルにmmapし、ファイル名を渡したいと思うかもしれません。 – HuStmpHrrr

+0

名前を渡すと、mmapを使用する必要はありません。これは匿名のmmapではなく、**共有メモリ**と呼ばれています。 –

+0

私はあなたが名前を渡しているのを見ません。 nullを渡すので、匿名です。 – HuStmpHrrr

答えて

2

execveが成功すると、virtual address space全体がスクラップされ、実行されたELFバイナリに対して再初期化されます。これはexecve(2)の主な役割の1つです。起動時に、プログラムは明確に定義されたメモリ状態を期待する必要があります。

という名前のファイルを使用する場合と同じように、プログラムの引数としてそのファイルの名前を渡すことがあります。

(IIRC、誰かがexecve accross永続メモリマッピングのためmmap(2)にフラグを追加するために何年も前のカーネルパッチを提案し、そのパッチは、正当な理由で、拒否された。私は完全な詳細を忘れてしまったし、非常に間違っている可能性が)

おそらくあなたはshm_overview(7)が必要です。または、ファイル名を指定してmmapMAP_SHAREDと入力してください。

(仮想)メモリを共有しても、何らかの同期手段が必要であることに注意してください。 sem_overview(7),futex(7)

また、ALPおよびOperating Systems: Three Easy Pieces(いずれも自由にダウンロード可能)をお読みください。 syscalls(2)も参照してください(inter-process communicationにはいくつかの方法があります)。

関連する問題