Chinaunix首页 | 论坛 | 博客
  • 博客访问: 824543
  • 博文数量: 92
  • 博客积分: 1498
  • 博客等级: 上尉
  • 技术积分: 993
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-18 18:31
文章分类

全部博文(92)

文章存档

2013年(2)

2012年(3)

2011年(3)

2010年(61)

2009年(23)

分类: LINUX

2009-11-20 22:07:23

在操作系统中的每一个进程必有一个父进程。
相应的,每个进程可以有0个或者多个子进程。
拥有同一个父进程的所有进程叫做兄弟,进程间的关系存放在进程描述符中。
每个task_strut都包含有一个指向父进程的task_struct,叫parent指针,
还包含有一个成为children的子进程链表。


上面的这些信息无疑都是描述了一个信息,进程家族树的创建思想。
由于简单的使用双向链表并不能完成的实现一个进程可以创建多个子进程,
而且多个进程共有一个父进程,这就需要另想办法了。
下面是我模拟创建的一个进程家族树的程序,我当中使用了5个进程。
其中1,2,3是由main函数中的task_head(相当于操作系统当中的init进程,
没来得及修改,和后面的参数有点重名)创建的,4,5进程是由1号进程创建的。
完后打印所有存在的进程信息,注意,我这里只是对这个家族树进行描述,并不是
真正的进程。



#include<stdio.h>
#include<stdlib.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;
}


如果大家有什么建议可以留言,大家共同学习,谢谢

阅读(4841) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-05 19:26:04

可以直接用list.h,然后配合自己写的函数应该会更好,哈哈。