0

作成したリストを異なるプロセス間で使用する方法を理解するのに苦労しています。私が持っているものは次のとおりです。

FileList.h - 作成したリスト

#include "Node.h"
typedef struct FileList {
    struct Node *first;
    struct Node *last;
    int length;
} FileList;

void fl_initialize();
void fl_add(char name[], char up[], bool status);
void fl_edit(Node *n, char up[]);
void fl_remove (char name[]);
int fl_length();
void fl_clear();
void fl_print();
void fl_print_node(Node *n);
void fl_uncheck();
bool fl_clean_unchecked();
Node* fl_get(int pos);
Node* fl_find (char name[]);

そして、私が作成するFileList.cppで

FileList fl;

そして、プロトタイプの機能を実装します。

main.cpp を簡略化します

#include "FileList.h"
int main (int argc, char *argv[]) {
    int r = fork();
    if (r == 0) {
        fl_initialize();
        call_function_that_add_list_elements();
        fl_print(); //List contains elements
    } else {
         waitpid(r, &status, WUNTRACED | WCONTINUED);
         if (WIFEXITED(status)) {
             fl_print(); //The list is empty (Is other list, probably);
             //another_function_that_should_keep_working_with_the_list();
         }
    }
}

このリストがヘッダーとして含まれるとグローバルにならないのはなぜですか?したがって、父と子のプロセスのために、どうすればグローバルにできますか?

4

1 に答える 1

0

fork によって作成されるプロセスはプロセスであり、スレッドではありません。したがって、プロセス間でリストを共有することについて話しているのであって、スレッド間でリストを共有するのではありません。

プロセス間でリストを直接共有することはできません。プロセス間で共有メモリを使用する必要があります。たとえば、使用できますmmap

How to share memory between process fork()? のプロセス間で共有メモリを使用する方法の:

共有メモリ ( shm_open()shm_unlink()mmap()など) を使用できます。

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

static int *glob_var;

int main(void)
{
    glob_var = mmap(NULL, sizeof *glob_var, PROT_READ | PROT_WRITE, 
                    MAP_SHARED | MAP_ANONYMOUS, -1, 0);

    *glob_var = 1;

    if (fork() == 0) {
        *glob_var = 5;
        exit(EXIT_SUCCESS);
    } else {
        wait(NULL);
        printf("%d\n", *glob_var);
        munmap(glob_var, sizeof *glob_var);
    }
    return 0;
}
于 2013-04-01T13:14:05.817 に答える