Posix在父进程和子进程之间共享内存?

问题描述 投票:1回答:1

我正在编写一个程序来解决操作系统概念书上的练习。这个问题是在子进程上创建一个Collat​​z猜想,并使用Posix共享内存将其打印回父进程。这是我的计划。

int main(int argc, char* argv[])
{
const char* name = "Collatz";
const int SIZE = 4096 * 30;
void *ptr;
int shm_fd;
int num = atoi(argv[1]);
pid_t pid;

shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SIZE);
ptr = mmap(0, SIZE, PROT_READ, MAP_SHARED, shm_fd, 0);
if (ptr < 0) perror("Ptr error");
pid = fork();
if (pid < 0) perror("Fork Failed");
else if (pid == 0) {
    shm_fd = shm_open(name, O_RDWR, 0666);
    ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
    if (ptr < 0) perror("Ptr error");
    while (num != 1) {
        sprintf(ptr, "%d", num);
        ptr++;
        if (num % 2 == 0) num /= 2;
        else num = 3 * num + 1;
    }
    sprintf(ptr, "%d", num);
    ptr++;
} else {
    wait(NULL);
    printf("Parent: %s\n", (char*) ptr);

    //ptr += sizeof(int);
    shm_unlink(name);
}
return 0;
}

但是当我用gcc编译它时,我得到了Segmentation fault(Core dump)。虽然搜索谷歌,但我不知道它。我使用Ubuntu 14.04。有人可以帮助我。非常感谢你,对不起我的英语不好。

c++ c posix ubuntu-14.04
1个回答
2
投票

我尝试使用以下包含编译您的代码,它对我有用。

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

你有没有想过在执行程序时传递一个整数参数? (例如)

./collatz 12 

输出1631518421

© www.soinside.com 2019 - 2024. All rights reserved.