标签:基于 otp 上下 有一个 列表 很多 set 网络服务 cti
挑选一个开源的操作系统,深入源码分析其进程模型,具体包含如下内容:
int main(void) { printf("pid = %d\n", getpid()); printf("ppid = %d\n", getppid()); return EXIT_SUCCESS; }
得到登陆的用户号、用户名,宿主目录信息:
char *login = getlogin(); struct passwd *ps = getpwnam(login); printf("user name = %s\n",ps->pw_name); printf("uid = %d\n",ps->pw_uid); printf("home dir = %s\n",ps->pw_dir);
fork 函数:
int main(void) { printf("begin\n"); pid_t child = fork(); if(child == -1) { return -1; } if(child == 0) { printf("is child\n"); }else { printf("is parent\n"); } printf("end\n"); return EXIT_SUCCESS; }
struct task_struct { ...... /* 进程状态 */ volatile long state; /* 指向内核栈 */ void *stack; /* 用于加入进程链表 */ struct list_head tasks; ...... /* 指向该进程的内存区描述符 */ struct mm_struct *mm, *active_mm; ........ /* 进程ID,每个进程(线程)的PID都不同 */ pid_t pid; /* 线程组ID,同一个线程组拥有相同的pid,与领头线程(该组中第一个轻量级进程)pid一致,保存在tgid中,线程组领头线程的pid和tgid相同 */ pid_t tgid; /* 用于连接到PID、TGID、PGRP、SESSION哈希表 */ struct pid_link pids[PIDTYPE_MAX]; ........ /* 指向创建其的父进程,如果其父进程不存在,则指向init进程 */ struct task_struct __rcu *real_parent; /* 指向当前的父进程,通常与real_parent一致 */ struct task_struct __rcu *parent; /* 子进程链表 */ struct list_head children; /* 兄弟进程链表 */ struct list_head sibling; /* 线程组领头线程指针 */ struct task_struct *group_leader; /* 在进程切换时保存硬件上下文(硬件上下文一共保存在2个地方: thread_struct(保存大部分CPU寄存器值,包括内核态堆栈栈顶地址和IO许可权限位),内核栈(保存eax,ebx,ecx,edx等通用寄存器值)) */ struct thread_struct thread; /* 当前目录 */ struct fs_struct *fs; /* 指向文件描述符,该进程所有打开的文件会在这里面的一个指针数组里 */ struct files_struct *files; ........ /* 信号描述符,用于跟踪共享挂起信号队列,被属于同一线程组的所有进程共享,也就是同一线程组的线程此指针指向同一个信号描述符 */ struct signal_struct *signal; /* 信号处理函数描述符 */ struct sighand_struct *sighand; /* sigset_t是一个位数组,每种信号对应一个位,linux中信号最大数是64 * blocked: 被阻塞信号掩码 * real_blocked: 被阻塞信号的临时掩码 */ sigset_t blocked, real_blocked; sigset_t saved_sigmask; /* restored if set_restore_sigmask() was used */ /* 私有挂起信号队列 */ struct sigpending pending; ........ }
/* wq为某个等待队列的队列头 */ void sleep_on (wait_queue_head_t *wq) { /* 声明一个等待队列结点 */ wait_queue_t wait; /* 用当前进程初始化这个等待队列结点 */ init_waitqueue_entry (&wait, current); /* 设置当前进程状态为TASK_UNINTERRUPTIBLE */ current->state = TASK_UNINTERRUPTIBLE; /* 将这个代表着当前进程的等待队列结点加入到wq这个等待队列 */ add_wait_queue (wq, &wait); /* 请求调度器进行调度,执行完schedule后进程会被移除CPU运行队列,只有等待队列唤醒后才会重新回到CPU运行队列 */ schedule (); /* 这里进程已经被等待队列唤醒,重新移到CPU运行队列,也就是等待的条件已经为真,唤醒后第一件事就是将自己从等待队列wq中移除 */ remove_wait_queue (wq, &wait); }
标签:基于 otp 上下 有一个 列表 很多 set 网络服务 cti
原文地址:https://www.cnblogs.com/78185669qq/p/9010606.html