Yshell(2)

Yshll 项目相关的文章

定义数据结构

首先,我们需要一个结构体来定义好命令:

1
2
3
4
5
6
7
8
typedef struct {
char *name; /* User printable name of the function. */
rl_icpfunc_t *func; /* Function to call to do the job. */
char *doc; /* Documentation for this function. */
} COMMAND;

//这个 rl_rcpfunc_t 是系统自带的函数指针类型,typedef int rl_icpfunc_t (char *);

同时对于 Shell 的状态信息,我们需要定义一个结构体:

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct Yshell_control_block{

Yshell_job fg_job; /* currently executing foreground job */

double execution_time; /* execution time of last command */

char history_commands_file[128]; /* command history log file */

Yshell_job_list jobs; /* list of currently suspened and runing jobs */

char pwd[128]; /* previous working directory */

} Yshell_control_block;

JOBS

我们需要支持前后台的进程管理,所以我们需要对于进程和 Job 定义不同的结构体:

JOBS 结构体:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//该结构体是 Yshell jobs 进程结构体
typedef struct Yshell_job_process{

char process_name[MAX_PROCESS_NAME_SIZE]; /* 进程名称 */

pid_t pid; /* 与命令相关的进程 pid */

struct Yshell_job_process *next; /* 列表中的下一个元素 */

}Yshell_job_process;


//该结构体是 Yshell jobs 结构体,使用列表来进行组织
typedef struct Yshell_job {

Yshell_job_process *head, *tail; /* 队列头和尾 */

char command[MAX_COMMAND_SIZE]; /* 实际的命令名称 */

int command_status; /* 命令的状态 */

int process_count; /* 单个命令创建的进程数 */

}Yshell_job;

根据上面的结构体,我们可以将进程使用链表的方式组织起来。同时,我们要需要使用一个链表来管理所有的 Job,所以我们需要定义一个结构体:

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct Yshell_job_node {
Yshell_job job;
struct Yshell_job_node *next;
}Yshell_job_node;


typedef struct Yshell_job_list{

Yshell_job_node *head, *tail; /* list of jobs suspended or running */

int count_jobs; /* number of such jobs */

} Yshell_job_list;

Yshell(2)
https://ysc2.github.io/ysc2.github.io/2024/07/09/Yshell(2)/
作者
Ysc
发布于
2024年7月9日
许可协议