免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2051 | 回复: 0
打印 上一主题 下一主题

进程家族树的描述 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-20 22:07 |只看该作者 |倒序浏览
在操作系统中的每一个进程必有一个父进程。相应的,每个进程可以有0个或者多个子进程。拥有同一个父进程的所有进程叫做兄弟,进程间的关系存放在进程描述符中。每个task_strut都包含有一个指向父进程的task_struct,叫parent指针,还包含有一个成为children的子进程链表。
上面的这些信息无疑都是描述了一个信息,进程家族树的创建思想。由于简单的使用双向链表并不能完成的实现一个进程可以创建多个子进程,而且多个进程共有一个父进程,这就需要另想办法了。下面是我模拟创建的一个进程家族树的程序,我当中使用了5个进程。其中1,2,3是由main函数中的task_head(相当于操作系统当中的init进程,没来得及修改,和后面的参数有点重名)创建的,4,5进程是由1号进程创建的。完后打印所有存在的进程信息,注意,我这里只是对这个家族树进行描述,并不是真正的进程。
#includestdio.h>
#includestdlib.h>
#define MAX_PID  65535 //最多创建的进程的个数
#define RDY_STATE 0 //就绪态
#define RIG_STATE 1 //运行态
#define BLK_STATE 2 //阻塞态
int PID = 1; //全局变量
typedef struct task_struct{
    long pid,father;
    long state;
    struct task_struct *parent;//指向父亲的一个指针
    struct task_struct *childHead0;//指向儿子的一个链表头
    struct task_struct *brother;//指向兄弟的链表(用于将父进程创建的儿子链接在一块的链表)
}task_struct;
void addToTask(task_struct *task_head,task_struct *task){
//将一个进程所创建的子进程链接在一起
    task_struct *childHead;//儿子链表的头结点(虚拟的,只是一个引导作用)
    childHead = (task_struct *)malloc(sizeof(task_struct));
    childHead->pid = 65535;
    childHead->father = 65535;
    childHead->parent = NULL;
    childHead->childHead0 = NULL;
    childHead->brother = NULL;
    task_head->childHead0 = childHead;
    task->brother = childHead->brother;
    childHead->brother = task;
    task->parent = task_head;
    free(childHead);
}
task_struct *create(task_struct *task_head,int father){
    task_struct *task;
    task = (task_struct *)malloc(sizeof(task_struct));
    task->pid = PID++;
    task->father = father;
    task->state = RDY_STATE;
    addToTask(task_head,task);//将当前进程用头插法链接到父亲进程的儿子链表上
    printf("~~~~~~~~~~~~~~~~~~~~~~~~\n");
    printf(" task->pid= %ld\n task->father= %ld\n task->state= %ld\n",task->pid,task->father,task->state);//打印当前进程的信息
    return task;
}
void init_task_struct(task_struct *task_head){
//初始化系统的init进程
    task_head->pid = 0;
    task_head->father = 0;
    task_head->state = RIG_STATE;
    task_head->parent = task_head;
    task_head->childHead0 = task_head;
    task_head->brother = task_head;
}
int main(){
    task_struct *task_head;//类似于init进程
    task_head = (task_struct *)malloc(sizeof(task_struct));
    init_task_struct(task_head);//初始化init进程
    task_struct *process1;
    task_struct *process2;
    task_struct *process3;//进程123由task_head创建
    task_struct *process4;
    task_struct *process5;//进程45由进程1创建
    process1 = create(task_head,task_head->pid);
    process2 = create(task_head,task_head->pid);
    process3 = create(task_head,task_head->pid);
   
    process4 = create(process1,process1->pid);
    process5 = create(process1,process1->pid);
   
   
    return 0;
}
如果大家有什么建议可以留言,大家共同学习,谢谢


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/104183/showart_2099696.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP