MCPcopy Create free account
hub / github.com/YatSenOS/YatSenOS-Tutorial-Volume-1 / fork

Method fork

lab8/src/7/src/kernel/program.cpp:354–386  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

352}
353
354int ProgramManager::fork()
355{
356 bool status = interruptManager.getInterruptStatus();
357 interruptManager.disableInterrupt();
358
359 // 禁止内核线程调用
360 PCB *parent = this->running;
361 if (!parent->pageDirectoryAddress)
362 {
363 interruptManager.setInterruptStatus(status);
364 return -1;
365 }
366
367 int pid = executeProcess("", 0);
368 if (pid == -1)
369 {
370 interruptManager.setInterruptStatus(status);
371 return -1;
372 }
373
374 PCB *child = ListItem2PCB(this->allPrograms.back(), tagInAllList);
375 bool flag = copyProcess(parent, child);
376
377 if (!flag)
378 {
379 child->status = ProgramStatus::DEAD;
380 interruptManager.setInterruptStatus(status);
381 return -1;
382 }
383
384 interruptManager.setInterruptStatus(status);
385 return pid;
386}
387
388bool ProgramManager::copyProcess(PCB *parent, PCB *child)
389{

Callers 1

syscall_forkFunction · 0.45

Calls 4

getInterruptStatusMethod · 0.45
disableInterruptMethod · 0.45
setInterruptStatusMethod · 0.45
backMethod · 0.45

Tested by

no test coverage detected