2

我有一个任务,我把头撞在墙上。它在 C 中。我感觉我接近解决方案,但是我无法让程序执行所需的操作。我正在更改数字和一些小细节,因为大多数班级都和我一样难过。

要求:创建3个进程,第一个将共享内存变量“total->value”从1增加到10000,第二个从10000增加到12000,第三个从12000增加到14000

流程函数被标记为(process1(),process2(),process3()),这些函数的内部如下

process1()
{
   int k = 0;
   while (k < 10000)
   {
      k++;
      total->value = total->value + 1;
   }
   printf("From process 1 = %d/n", total->value);
}

第二个是 k < 2000 (因为它只需要增加共享值 2000 更多)等等。

该计划的主要部分是:

main()
{
   int shmid;
   int pid1;
   int pid2;
   int pid3;
   int ID;
   int status;
   char *shmadd = (char *)0;

   /* Create and connect to a shared memory segmentt */
   if ((shmid = shmget(SHMKEY, sizeof (int), IPC_CREAT | 0666)) < 0)
   {
      perror("shmget");
      exit(1);
   }

   if ((total = (shared_mem *)shmat(shmid, shmadd, 0)) == (shared_mem *)-1)
   {
      perror("shmat");
      exit(0);
   }

   total->value = 0;

   if ((pid1 = fork()) == 0)
      process1();

   if ((pid1 != 0) && (pid2 = fork()) == 0)
      process2();

   if ((pid1 != 0) && (pid2 != 0) && (pid3 = fork()) == 0)
      process3();

   if ((pid1 != 0) && (pid2 != 0) && (pid3 != 0))
   {
      if ((shmctl(shmid, IPC_RMID, (struct shmid_ds *)0)) == -1)
      {
         perror("shmctl");
         exit(-1);
      }
      printf("\t\t  End of Program.\n");
   }
}

我需要的是在第二个开始之前完成第一个过程。我尝试在 process1() (或 2 个或 3 个)调用之后插入一个 wait(&status) 并且不知所措。任何指针?(没有双关语)=)还有更多要实现的,但我相信一旦我有了这部分,我就可以自己处理剩下的部分。我在某些方面故意含糊其辞,但我想完成这个项目,更重要的是理解它,还有其他人想要免费午餐。我将在所需的代码中提供任何其他内容。预先感谢您的帮助

输出应该出现

From process 1 = 10000  
From process 2 = 12000  
From process 3 = 14000  
4

1 回答 1

0

我相信 Celada 对要求的评论/猜测是正确的。但是,除此之外,并且冒着做太多工作的风险,以下代码满足您的规范。__sync_fetch_and_add()可能不需要使用内置的 gcc 。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/wait.h>

static struct {
   int value;
} *total;

static void process1(void) { 
   int k = 0;  
   while (k < 10000) {  
      k++;  
      __sync_fetch_and_add(&total->value, 1);  
    }  
    printf("From process 1 = %d\n", total->value); //<-- not quite right: could be >10000
}

static void process2(void) { 
   int k = 0;
   while (__sync_fetch_and_add(&total->value, 0) != 10000)
      ;
   while (k < 2000) {  
      k++;  
      __sync_fetch_and_add(&total->value, 1);  
   }  
   printf("From process 2 = %d\n", total->value);
}

static void process3(void) { 
   int k = 0;  
   while (__sync_fetch_and_add(&total->value, 0) != 12000)
      ;
   while (k < 2000) {  
      k++;  
      __sync_fetch_and_add(&total->value, 1);  
    }  
    printf("From process 3 = %d\n", total->value);
}

int main(void) {
   int   shmid;
   int   pid1;
   int   pid2;
   int   pid3;
   int   status;

   /* Create and connect to a shared memory segment */
   if ((shmid = shmget(1234, sizeof *total, IPC_CREAT|0666)) < 0) {
      perror ("shmget");
      exit (1);
   }
   if ((total = shmat(shmid, 0, 0)) == (void *)-1) {
      perror("shmat");
      exit (0);
   }
   total->value = 0; // not necessary in Linux if IPC_CREAT invoked

   if (!(pid1 = fork()))
      process1();
   else if (!(pid2 = fork()))
      process2();
   else if (!(pid3 = fork()))
      process3();
   else {
      wait(&status);
      wait(&status);
      wait(&status);
      if ((shmctl(shmid, IPC_RMID, (struct shmid_ds *) 0)) == -1) {
         perror("shmctl");
         exit (-1);
      }
      printf("\t\t  End of Program.\n");
   }
   return 0;
} 
于 2012-10-03T01:08:42.917 回答