目录
- typedef struct {
- // 其他成员...
- int status; // 假设你有一个状态字段来表示 PCB 的状态
- } PCB;
-
- // 定义状态常量
- #define NEW 1
- #define RUNNING 2
- #define BLOCK 3
- // 这里定义了进程运行可能处的状态。
- #define TASK_RUNNING 0 // 进程正在运行或已准备就绪。
- #define TASK_INTERRUPTIBLE 1 // 进程处于可中断等待状态。
- #define TASK_UNINTERRUPTIBLE 2 // 进程处于不可中断等待状态,主要用于I/O 操作等待。
- #define TASK_ZOMBIE 3 // 进程处于僵死状态,已经停止运行,但父进程还没发信号。
- #define TASK_STOPPED 4 // 进程已停止。
task_struct
结构体对象加入到运行队列中(将 task_struct
对象的 state
字段设置为 TASK_RUNNING
)当调度器选择了一个进程执行,它会从相应的运行队列中取出对应的 task_struct
结构体对象,并将其中的信息(寄存器状态、程序计数器(PC)的值等)加载到CPU中,CPU会根据加载的信息开始执行进程的指令,直到进程遇到一个需要等待的事件(例如等待I/O操作完成)或者时间片(时间片轮转调度)用完
- static const char *task_state_array[] = {
- "R (running)", /* 0 */
- "S (sleeping)", /* 1 */
- "D (disk sleep)", /* 2 */
- "T (stopped)", /* 4 */
- "T (tracing stop)", /* 8 */ //进程被调试器暂停
- "Z (zombie)", /* 16 */ //僵尸进程,它已经结束执行,但其父进程还未对其进行善后处理
- "X (dead)" /* 32 */ //进程已经结束执行
- };
while :;do ps ajx | head -1 && ps ajx | grep mybin |grep -v "grep";sleep 1;echo "#————————————————————————————————————————————————————#";done
grep -v "grep"
:这个部分会排除掉包含 "grep" 字符串的行,以避免显示出grep命令本身 - #include
- #include
- int main()
- {
- while(1)
- {
- printf("hello,world\n");
- sleep(1);
- }
- return 0;
- }
- #include
- #include
- int main()
- {
- while(1)
- {
-
- }
- return 0;
- }
- kill -SIGSTOP 18262//将进程号为18262的进程暂停
- kill -SIGCONT 18262//让进程号为18262的进程从暂停状态中恢复,继续执行
- #include
- #include
- #include
//exit的头文件 - int main()
- {
- pid_t id = fork();
- if(id < 0)//创建进程失败
- {
- return 1;
- }
- else if(id == 0)
- {
- while(1)
- {
- printf("I am a child....\n");
- sleep(1);
- }
-
- }
- else{//父进程
- int count = 5;
- while(count)
- {
- printf("I am a father, run times: %d\n",count--);
- sleep(1);
- }
- printf("I am a father, dead!: %d\n",count--);
- exit(1);
- }
-
- return 0;
- }
ps -la //以详细的格式显示所有运行中的进程,包括所有用户的进程