C语言 按引用传递结构的数组

bnl4lu3b  于 2023-03-01  发布在  其他
关注(0)|答案(1)|浏览(148)

我必须派生一些子进程,并在它们派生到一个名为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];的方法

klh5stk1

klh5stk11#

父进程应等待子进程运行到exit(0),然后再打印processTable
1.添加一个变量来保存子进程的退出状态。

pid_t pid;
int status;

1.在父进程中,调用waitpid()以等待子进程exit()

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

参考:waitpid()
使用IPC(inter-process communication)更新
fork()创建新进程,每个进程都拥有自己的私有内存空间,因此,传入的指针将指向其私有内存空间,而不是父进程的私有内存空间,这就是父进程中PCB结构体为空的原因。
而进程中的线程将共享相同的内存空间。
进程间交换信息解决方案是IPC。
在Linux系统上,mmap()shmget()有助于进程之间交换信息。This post可能会有帮助。
对于Windows系统,有several methods在进程之间交换数据。This post可能会有帮助。

相关问题