使用linux中共享内存中的子进程计算1到2000之和

时间:2017-03-05 16:09:27

标签: c linux

我有一个问题,我必须使用子进程计算从1到2000的总和。这是我的代码:

     #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <stdio.h>
    #include <sys/wait.h>  /* Needed for the wait function */
    #include <unistd.h>    /* needed for the fork function */
    #include <string.h>    /* needed for the strcat function */
    #define SHMSIZE 27
    int main() {
       int shmid;
       char *shm;
       int tong1=0;
 int tong2=0;
       if(fork() == 0) {
          shmid = shmget(2009, SHMSIZE, 0);
          shm = shmat(shmid, 0, 0);
          int i;

          for(i=0; i<1000; i++) {
            tong1=tong1+i;
          }
          shmdt(shm);
       }
       else {

          shmid = shmget(2009, SHMSIZE, 0666 | IPC_CREAT);
          shm = shmat(shmid, 0, 0);
          wait(NULL);
          int j;

          for(j=1000; j<=2000; i++) {
            tong2=tong2+j;
          }
          shmdt(shm);
          shmctl(shmid, IPC_RMID, NULL);
       }
       int tong=0; tong=tong1+tong2;
printf("Sum is: %d",tong);
       return 0;
    }

但是当我运行时结果是:Sum是499500 Sum是1501500.我哪里错了?

2 个答案:

答案 0 :(得分:1)

因为在第二个周期中,您执行的是i++而不是j++

  for(j=1000; j<=2000; i++) { // <== should be j++
    tong2=tong2+j;
  }

答案 1 :(得分:0)

您正在创建一个共享内存段,但您没有使用它!简单地创建共享内存段不会导致进程之间共享局部变量 - 您需要实际读取和写入共享内存。