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

Method fork

lab8/src/6/src/kernel/program.cpp:358–390  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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

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