通过引用传递结构数组

Passing array of struct by reference

提问人:Just A Guy 提问时间:2/22/2023 最后编辑:chqrlieJust A Guy 更新时间:2/25/2023 访问量:78

问:

我必须分叉一些子项,并在它们分叉到称为 PCB 的结构数组中时跟踪一些值。我使用一个名为 forker 的函数来分叉子进程,并在其中尝试修改结构数组,但是当我在 fork 函数之后打印整个结构时,它是空白的并且充满了零。forker 函数跟踪启动的子项总数,我将其用作数组的索引。知道我做错了什么,以至于它不会在我的结构中保存值吗?

Forker 函数

int forker(int totaltoLaunch, int simulLimit, int timeLimit,
           int totalLaunched, PCB *processTable)
{
    pid_t pid;
    if (totalLaunched == simulLimit) {
        return (totaltoLaunch);
    }
    else if (totaltoLaunch > 0)
    {
        if ((pid = fork()) < 0)
        {
            perror("fork");
        }
        else if (pid == 0)
        {
            processTable[totalLaunched].occupied = 1;
            processTable[totalLaunched].pid = pid;
            processTable[totalLaunched].startSeconds = 0;
            processTable[totalLaunched].startNano = 1;
            
            printf("I am a child and supposed to run %d seconds\n", timeLimit);
            exit(0);
        }
        else if (pid > 0)
        {
            forker(totaltoLaunch - 1, simulLimit, timeLimit,
                   totalLaunched + 1, processTable);
        }
    }
    else
        return (0);
}

这就是我创建流程表的方式PCB processTable[20];

数组 C 结构 按引用传递

评论

0赞 Support Ukraine 2/22/2023
“当我打印整个结构时......”我没有看到任何打印它的代码
0赞 ikegami 2/22/2023
你修改了孩子的,但我假设你打印了父母的processTableprocessTable
0赞 ikegami 2/22/2023
提示:递归在这里没有意义。使用循环。
0赞 Support Ukraine 2/22/2023
您是否希望孩子所做的更改对父母可见?
0赞 Just A Guy 2/24/2023
既然它是通过引用传递的,它不会改变全局结构吗?我使用递归是因为我只应该同时发射这么多子项,并且觉得这是返回剩余数量待发射的最佳方式

答:

2赞 user6099871 2/22/2023 #1

父进程应等待子进程运行到,然后再打印 .exit(0)processTable

  1. 添加一个变量来保存子项的退出状态。

    pid_t pid;
    int status;
    
  2. 在父进程中,调用以等待子项。waitpid()exit()

     forker(totaltoLaunch - 1, simulLimit, timeLimit, totalLaunched + 1, processTable);
     waitpid(pid, &status, WNOHANG);
    

参考:waitpid()


使用IPC(进程间通信)进行更新

fork()创建新进程,每个进程都拥有其私有内存空间。因此,被传递到的指针将寻址到其私有内存空间,而不是父级的。这就是为什么 PCB 结构在父进程中为空的原因。

同时,进程中的线程将共享相同的内存空间。

在进程之间交换信息的解决方案是IPC。

在 Linux 系统上,mmap() 和 shmget() 将有助于在进程之间交换信息。这篇文章可能会有所帮助。

对于Windows系统,有几种方法可以在进程之间交换数据。这篇文章可能会有所帮助。

评论

0赞 Just A Guy 2/24/2023
我在函数后有一个 nohang wait 调用,PCB 结构仍然是空白的。我以为,由于我传递了指向全局创建结构的指针,因此父进程的更改将被父级看到
0赞 user6099871 2/24/2023
然后,应考虑IPC(进程间通信)。