2012-12-28 73 views
0

大衛Shwartz幫助我很多,現在它有點作品... 你有任何想法更加優雅的方式來解析輸入,如果輸入包含超過2個數字添加哪些需要由孩子處理?我希望孩子只能得到兩個整數,這就是爲什麼我創建共享內存的原因,因此父親會將結果(共享內存)+另一個整數發送給孩子。共享內存父親和孩子在c

謝謝大家。

#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <string.h> 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 

volatile int *shared=0; 
int shmid; 

int main() 
{ 

char line[256]; 
int readByte; 


int fd[2]; //pipe to son, who processes addition 
int pid; 

shmid=shmget (IPC_PRIVATE, sizeof(int) , 0600); 

shared=shmat (shmid, 0 , 0); 


if (pipe(fd)) 
{ 
    perror("pipe"); 
    exit(-1); 
} 

pid=fork(); 

if (pid!=0) // father 
{ 
    close (fd[0]); 

    readByte=read(0, line, 256); 
    line[readByte-1]='\0'; 
    printf("%d",readByte); 

    int arr[2]; 
    int i=0; 
    int j=0; 
    int flag=0; 
    char num[10]; 

    while (i<readByte) 
    { 
     if (line[i]=='+') 
     { 
      i++; 
      j=0; 
      flag=1; 
     } 

      while (line[i]!='+' && line[i]!='\0') 
      { 
      num[j]=line[i]; 
      i++; 
      j++; 
      } 
      num[j]='\0'; 

     if (flag==0) 
      arr[0]=atoi(num); 
     else 
     { 
      arr[1]=atoi(num); 
      i++; 
     } 

    } 
     printf("first %d\n",arr[0]); 
     printf("sec %d\n",arr[1]); 

     write(fd[1], &arr, sizeof(arr)); 
     wait(NULL); 

     printf ("%d\n" , *shared); 

} 
else 
    // son 
    { 
     int arr[2]; 
     int sum; 

     readByte = read(fd[0], &arr, sizeof(arr)); 

     printf("son printing: %d\n",arr[0]); 
     printf("son printing: %d\n",arr[1]); 

     sum =arr[0]+arr[1]; 
     *shared=sum; 

     close (fd[0]); 
     shmdt ((const void *) shared); 
    } 

shmdt ((const void *) shared); 
shmctl (shmid , IPC_RMID , 0); 

close(fd[1]); 

return 0; 

}

+0

變量'shared'不共享,共享內存區域共享。您需要在共享內存區域內更改*內容。 –

+0

另外,你扔掉'shmat'的結果,這也沒有幫助。 –

回答

0

你扔掉的shmat返回值。你期望shared被分享,但它只是一個常規變量。另外,您需要阻止編譯器優化對共享內存的訪問。這裏修復了所有致命錯誤:

#include <sys/types.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <string.h> 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 

volatile int *shared; 
int shmid; 

int main() 
{ 
    int s,i; 

    shmid=shmget (IPC_PRIVATE, sizeof(int), 0600); 

    shared=shmat (shmid, 0 , 0); 
    *shared=100; 

    printf ("%d\n" , *shared); 
    if (fork()==0) // son 
    { 
     *shared=1000; 
     shmdt ((const void *) shared); 
    } 
    else // father 
    { 
      wait (&s); 
      printf ("%d\n" , *shared); 
      shmdt ((const void *) shared); 
      shmctl (shmid , IPC_RMID , 0); 
    } 
    return 0; 
} 
+0

每個進程都有'fork'前面的共享內存段,因此每個進程都需要在之後分離它。 (實際上,'兒子'會在它終止時隱式分離它,所以這不是真的需要。)爲了避免出現'volatile'的警告,需要演員。 –

+0

代碼中有許多許多錯誤。我建議或者使用調試器來分析核心文件,或者在代碼中添加大量的'printf'語句,以查看它們的位置。 –