提问人:Just A Guy 提问时间:2/22/2023 最后编辑:chqrlieJust A Guy 更新时间:2/25/2023 访问量:78
通过引用传递结构数组
Passing array of struct by reference
问:
我必须分叉一些子项,并在它们分叉到称为 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];
答:
2赞
user6099871
2/22/2023
#1
父进程应等待子进程运行到,然后再打印 .exit(0)
processTable
添加一个变量来保存子项的退出状态。
pid_t pid; int status;
在父进程中,调用以等待子项。
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(进程间通信)。
下一个:如何理解辅助指针?
评论
processTable
processTable