⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fork.c

📁 msLinux v1.0 可以在arm ads 下仿真运行的linux
💻 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 + -