2015-10-13 77 views
0

我有下面的代碼應該創建一個分叉進程來執行Collat​​z猜想(基於傳遞的值),並將整數推入共享內存。當子進程完成時,父進程應該打印出這些值。出於某種原因,我的代碼有時可以使用,但不是其他的。從調試語句中,我可以看到值被推入,但有時打印出值的代碼似乎不會執行(僅打印一些空白行)。我在一個虛擬框中使用Debian Linux。帶有分叉子的共享內存

#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <sys/shm.h> 
#include <sys/mman.h> 

int main() 
{ 
    const int SIZE = 2048; 
    const char *name = "SHARON"; 
    int shm_fd; 
    void *ptr; 
    int count = 1; 

    /* Setup shared memory */ 
    shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666); 
    ftruncate(shm_fd, SIZE); 
    ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0); 

    /* Get the starting value */ 
    int value; 
    printf("Enter a positive integer value: "); 
    scanf("%d", &value); 
    printf("\n"); 
    if (value < 0) 
    { 
     printf("ERROR: Integer value must be positive!"); 
     return 1; 
    } 

    /* Fork child process */ 
    pid_t pid; 
    pid = fork(); 

    fork(); 
    if (pid < 0) 
    { 
     fprintf(stderr, "FORK FAILED\n"); 
     return 1; 
    } 
    else if (pid > 0) /*parent process*/ 
    { 
     wait(); /*wait for child to send */ 
     while (atoi((char *)ptr) != 0) /*0 is terminate value*/ 
     { 
     printf("%s", (char *)ptr); 
     ptr += sizeof(int); 
     if (atoi((char *)ptr) != 0) 
      printf(", "); 
     } 

     printf("\n"); 
     shm_unlink(name); 
    } 
    else if (pid == 0) /* child process */ 
    { 
     sprintf(ptr, "%d", value); 
     ptr += sizeof(value); 

     while (value != 1) 
     { 
     if (value % 2 == 0) 
      value /= 2; 
     else 
      value = value * 3 + 1; 

     sprintf(ptr, "%d", value); 
     ptr += sizeof(value); 
     } 
     sprintf(ptr,"0"); //push a "terminate" value 
     ptr += sizeof(value); 
    } 
    return 0; 
} 

任何提示我做錯了什麼?

+2

也許是因爲你連續兩次調用'fork'? – kaylum

+0

爲什麼要將字符串零置入共享內存中,然後推進整數零的大小? –

+0

OMG,我怎麼沒有看到?這看起來就是這個問題!像David指出的那樣,我也修正了推動0。多謝你們! – DaWood

回答

0

有兩個fork()調用。這將創造兩個孩子。

pid = fork(); 

    //fork(); 

你可以試試以上。