0

我不明白为什么在父进程中我的数据没有设置为我在子进程中设置的值。我在 fork 程序之前创建了 shared_data 结构变量,所以它应该是共享内存,对吗?

这是代码:

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>

#define MAX_SEQUENCE 20

typedef struct
{
  long fib_sequence[MAX_SEQUENCE];
  int sequence_size;
} shared_data;

void fibonacci(shared_data* sdata);

int main ( int argc, char *argv[])
{

   pid_t pid, pid1;
  shared_data sdata;

 /* check for parameter values to program */
  int i;
  for(i = 0; i < argc; i++)
  {
     if(strcmp(argv[i], "-ms") == 0)
     {
         int j = ++i;
         if(argv[j])
         {
            /* set passed in value to the sequence_size */
            int paramValue = atoi(argv[j]);
            if(paramValue <= MAX_SEQUENCE)
            {
                sdata.sequence_size = paramValue;
            }
            else
            {
                sdata.sequence_size = MAX_SEQUENCE;
            }
        }
        break;
    }
}

printf("sequence size: %i\n", sdata.sequence_size);

/* fork a child process */
pid = fork();

if (pid < 0)
{
    /* error occurred */
    fprintf(stderr, "Fork Failed");
    return 1;
}
else if (pid == 0)
{
    /* child process */
    pid1 = getpid();
    printf("current child process id = %d\n",pid);
    printf("child's parent process id = %d\n",pid1);
    fibonacci(&sdata);
    printf("child: [%d] Fibonacci Result: %i\n", getpid(), sdata.fib_sequence[sdata.sequence_size - 1]);
}
else
{
    /* parent process */
    pid1 = getpid();
    printf("current parent process id = %d\n",pid); /* C */
    printf("current parent process parent id = %d\n",pid1); /* D */
    wait(NULL);
    int i =0;
    for(i = 0; i < sdata.sequence_size; i++)
    {
        printf("parent: [%d] Fibonacci Result: %i\n", getpid(), sdata.fib_sequence[i]);
       }
     }
   }
void fibonacci(shared_data* sdata)
{
 int first = 0;
 int second = 1;
 int next;

int i;
for(i = 0; i < sdata->sequence_size; i++)
{
    if(i <= 1)
    {
        next = i;
    }
    else
    {
        next = first + second;
        sdata->fib_sequence[i] = next;

        first = second;
        second = next;
    }
     printf("child: [%d] %i\n", getpid(), next);
   }
 }
4

2 回答 2

0

在 fork 期间,您的所有内存(甚至是预分配的内存)都变得不共享。在实现层面上,它可能会变成写时复制,但可见效果是一样的。

您可以使用 POSIX shm_open(和朋友)来分配共享内存。

于 2013-01-30T17:59:21.897 回答
0

进程间通信(IPC)并不是这样直接实现的。您将不得不使用shmget() shmat()函数来使用共享内存来实现相同的功能。

有关更多信息,请参阅有关这些函数shmget()shmat()的详细信息

于 2013-01-30T18:03:26.547 回答