繁体   English   中英

为什么数组无法通过fork()函数工作?

[英]Why doesn't array work by using fork() function?

我试图解决这个问题。

问题是

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

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

妈妈的过程应该等到孩子写完为止。 子进程完成后,母进程将打印出数组(例如1,2,...,10),并将其全部替换为-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

我的输出是

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. 共享内存,由Unix内核的shm* API提供
  3. 内存映射文件,由Unix内核的mmap API提供

建议:阅读已故的W. Richard Stevens可以找到的所有内容,例如Unix Env​​ironment中的Programming

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM