2015-10-13 153 views
0

大家都好!我只是試圖在Linux中使用fork()函數來了解有關父進程和子進程的更多信息。 我想做一個非常簡單的程序,其中設置共享內存段後,我可以從一個孩子得到一個結果並將其輸出到父級。 我的問題是它似乎沒有工作。以下是我迄今爲止Linux中的共享內存叉進程學習

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h>  
#include <sys/shm.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#define SZ 20 

typedef struct 
{ 
    int size; 
    int cz[SZ]; 
}shared_data; 

    shared_data* Collatz(int); 

int main (void) 
{ 
     pid_t pid; 
     int seg_id,size=sizeof(shared_data); 
     seg_id=shmget(IPC_PRIVATE,size,S_IRUSR | S_IWUSR); 
     shared_data *sd=(shared_data *)shmat(seg_id,NULL, 0); 

    int usr=-1,count,i; 
    while(usr<1 ||usr >9) 
{ 
    printf("Please Enter a Number between 1-9:"); 
    scanf("%d",&usr); 
} 

pid=fork(); 
if(pid<0) 
{ 
    printf("Fork Failed"); 
    return 1; 
} 
if(pid==0) 
{ 
    sd=Collatz(usr); 
    shmdt(sd); 

} 
else 
{ 
    wait(NULL); 
    printf("\nThe Sequence is: %d ",count); 
      for(i=0;i<sd->size;i++) 
      { 
        printf(" %d ",sd->cz[i]); 
      } 
    printf("\n"); 

} 
return 0; 
} 



shared_data* Collatz(int val) 
{ 
    int i=0; 
    shared_data *data=malloc(sizeof(shared_data)); 
    data->cz[i]=val; 

    while(val!=1) 
    { 
     i++; 
     if(val%2==0) 
     val=val/2; 
     else 
     val=(3*val)+1; 
     data->cz[i]=val; 
} 
data->size=i; 
return data; 

}

+0

你是什麼意思,它不起作用?位含糊 –

+0

我apoligise我得不到從父方面基本上輸出。從我看到的情況來看,因爲這種情況下的共享內存部分* sd-> size沒有值。所以我只是假設我搞砸了或共享內存配置不正確,或者我搞砸了一些代碼 – user3819032

回答

0

您分配與malloc分配的內存,不與shmget/shmat分配的內存。我不是100%確定你的意圖,但可能只是簡單地將孩子的任務改爲以下任務就可以了。 (這將覆蓋與您在Collatz()初始化malloc d內容的共享內存)。

*sd=Collatz(usr); 

[編輯:我要補充一點,你當前的代碼sd=Collatz(usr)是不是覆蓋指針價值,你從回來shmat()而不是指向內存區域。]