共享内存父亲和孩子在c

时间:2012-12-28 21:32:03

标签: memory fork shared

David Shwartz 帮助了我很多,现在它有点工作...... 如果输入包含多于2个需要由孩子处理的数字,你有什么想法以更好的方式来解析输入吗?我希望孩子只获得两个整数,这就是为什么我创建了共享内存,所以父亲会向孩子发送结果(共享内存)+另一个整数。

谢谢大家。

 #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;

}

1 个答案:

答案 0 :(得分: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;
}