通过引用传递结构体数组

3

我必须分叉一些子进程,并在名为PCB的结构体数组中跟踪一些值。我使用了一个名为forker的函数来分叉子进程,并试图在其中修改结构体数组,但是当我在fork函数后打印整个结构体时,它是空白的且全是零。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];


当我打印整个结构体时,我没有看到任何打印代码。 - Support Ukraine
你修改了子进程的processTable,但我猜你打印的是父进程的processTable - ikegami
提示:在这里使用递归没有意义。请使用循环。 - ikegami
你希望子级所做的更改能够在父级中可见吗? - Support Ukraine
由于它是通过引用传递的,那么它不会改变全局结构吗?我使用递归,因为我只能同时启动这么多子进程,并且觉得这是返回剩余要启动的数量的最佳方法。 - Just A Guy
1个回答

2
父进程应该等待子进程运行到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 系统,有几种方法可以在进程之间交换数据。这篇文章可能会有所帮助。


我在函数后面有一个nohang等待调用,但是PCB结构仍然为空。我以为由于我传递了指向全局创建的结构的指针,子进程的更改将对父进程可见。 - Just A Guy
然后,应该考虑进程间通信(IPC) - user6099871

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接