我必须派生一些子进程,并在它们派生到一个名为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];
的方法
1条答案
按热度按时间klh5stk11#
父进程应等待子进程运行到
exit(0)
,然后再打印processTable
。1.添加一个变量来保存子进程的退出状态。
1.在父进程中,调用
waitpid()
以等待子进程exit()
。参考:waitpid()
使用IPC(inter-process communication)更新
fork()
创建新进程,每个进程都拥有自己的私有内存空间,因此,传入的指针将指向其私有内存空间,而不是父进程的私有内存空间,这就是父进程中PCB结构体为空的原因。而进程中的线程将共享相同的内存空间。
进程间交换信息解决方案是IPC。
在Linux系统上,mmap()和shmget()有助于进程之间交换信息。This post可能会有帮助。
对于Windows系统,有several methods在进程之间交换数据。This post可能会有帮助。