我正在编写一个程序来解决操作系统概念书上的练习。这个问题是在子进程上创建一个Collatz猜想,并使用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。有人可以帮助我。非常感谢你,对不起我的英语不好。
我尝试使用以下包含编译您的代码,它对我有用。
#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