【问题标题】:Fork - Share list between forked processFork - 分叉进程之间的共享列表
【发布时间】:2013-04-01 13:11:06
【问题描述】:

我在弄清楚如何使用我在不同进程之间创建的列表时遇到了麻烦。我有的是:

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();
         }
    }
}

为什么这个列表一旦作为标题包含在内就不是全局的,因此对于父子进程,我怎样才能使其成为全局?

【问题讨论】:

标签: c fork share


【解决方案1】:

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;
}

【讨论】:

  • 嗯...这比我想象的要复杂...我会尽快尝试,感谢您的快速回复
  • @JoãoMenighin 我知道:您必须使用其他解决方案,例如线程。使用线程,您可以毫无问题地共享列表。任何方式都欢迎您
猜你喜欢
  • 2013-10-12
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 2021-04-30
  • 2021-12-02
  • 2015-12-19
相关资源
最近更新 更多