2015-08-26 152 views
1

我正在編寫一個程序來解決操作系統概念的練習。這個問題是在子進程上創建一個Collat​​z猜想,並使用Posix共享memeory將其打印回父進程。這是我的程序。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; 
} 

但是,當我與海灣合作委員會 complie它,我得到分割故障(核心轉儲)。儘管通過谷歌搜索,但我不知道它。我使用Ubuntu 14.04。有人可以幫助我嗎?非常感謝你,併爲我可憐的英語感到難過。

+0

編譯時,你得到段錯誤?不在運行時? – Henrik

+0

如果你使用的是gcc,那麼你也應該使用gdb。 – stark

+0

可憐的我,我沒有傳遞一個整數參數。 – toantruong

回答

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

+0

另外,在第22行中,您應該計算代表計算值的字符串的長度,並將該長度的ptr增加1而不是1.這樣,具有多個數字的數字將不會被截斷。 –

+0

非常感謝,可憐我。 – toantruong