为什么数组不使用fork()函数?

时间:2017-04-28 06:48:06

标签: c process fork

我试着解决这个问题。

问题是

我应该创建一个创建子进程的进程。

子进程应该将1到10写入int数组大小为10 {初始值为0}。

母亲过程应该等到孩子完成写作。 子进程完成后,母进程打印出数组(例如1,2,...,10)并将all全部替换为-1并再次打印出数组。

儿童是生产者,母亲是消费者。 (只有一个孩子,只有一个消费者。他们只做一次。)

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

int main(){
int arr[10]={0,};
pid_t pid;
int state;
pid = fork();

if(pid == -1) // error
{
    printf("can't fork, error\n");
    exit(-1);
}

else if (pid == 0) // Child ( producer )
{
    printf("\nProducer is created.\n");

    printf("array: ");
    for(c=0; c<10; c++)
    {
        printf("%d ", arr[c]);
        arr[c]=c+1;
    }

}

else // Mother ( consumer )
{
    pid=wait(&state);
    sleep(1);
    printf("\nConsumer takes control of array");


    printf("\narray:");

    for(j=0;j<10;j++) 
    {
        printf(" %d", arr[j]);
    }


    printf("\nConsumer is done.");

    printf("\narray: ");
    for ( i =0; i<10; i++)
    {

        arr[i]=-1;
        printf("%d ", arr[i]);


    }
    printf("\ndone\n");
    exit(0);
}
return 0;}

我想要输出

0 0 0 0 0 0 0 0 0 0

1 2 3 4 5 6 7 8 9 10

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

我的出局是

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0

-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

我的代码有什么问题?

2 个答案:

答案 0 :(得分:2)

进程的内存地址空间将&#34; copy on write&#34;。因此,两个进程之间不共享数组。

答案 1 :(得分:0)

如果您想在不同进程(例如父进程和子进程)之间共享大量数据,可以采用多种方式。其中三个最常见的是

  1. 制作人写入文件;消费者读取文件
  2. 共享内存,由Unix内核的shm* API提供
  3. 内存映射文件,由Unix内核的mmap API提供
  4. 建议:阅读已故伟大的W. Richard Stevens可以找到的所有内容,例如 Unix环境中的编程