📄 fork.c
字号:
/* MShowTec - www.mshowtec.com
** msLinux fork.c ver1.0
** 20051221 lmjx create limiao@mshowtec.com
**
*/
#define MSLINUX_FORK_C
#include "sched.h"
#include "errno.h"
#include "malloc.h"
#include "fork.h"
long last_pid = 0;
struct task_struct *fork_tcb;
int find_empty_and_copy_process ()
{
int i;
struct task_struct *p;
char *p_stack = 0;
repeat:
if ((++last_pid) < 0)
last_pid = 1;
for (i = 0; i < NR_TASKS; i++)
if (task[i] && task[i]->pid == last_pid)
goto repeat;
for (i = 1; i < NR_TASKS; i++)
if (!task[i]){
p = (struct task_struct *)malloc(sizeof(tcb));
if(!p)
return -EAGAIN;
task[i] = p;
*p = *current;
p_stack = (char*)malloc(current->stack.L_Stack_SZ);
if(!p_stack){
free(task[i]);
task[i] = 0;
return -EAGAIN;
}
p_stack[0] = 0x55; //for stack check
p->stack.p_SP = (unsigned long)(p_stack + (current->stack.L_Stack_SZ-1));
p->stack.p_TopOfStack = (unsigned long)p_stack;
p->stack.L_Stack_SZ = current->stack.L_Stack_SZ;
memcpy(p->stack.p_TopOfStack,current->stack.p_TopOfStack,current->stack.L_Stack_SZ);
p->state = TASK_UNINTERRUPTIBLE;
p->pid = last_pid;
p->father = current->pid;
p->counter = p->priority;
p->signal = 0;
p->alarm = 0;
p->leader = 0; /* process leadership doesn't inherit */
p->start_time = jiffies;
p->state = TASK_RUNNING; /* do this last, just in case */
fork_tcb = p;
return 0;
}
return -EAGAIN;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -