[操作系统实验] Todolist

typedef struct SimpleCmd{
	int isBack;
	char **args;
	char *input;
	char *output
}




以上是原来的


改为
typedef struct Cmd{
	int isBack;	//时候为后台任务
	int cmdCount;	//单个命令的数目,就是以管道分隔符‘|’分割开来的命令的数目
	char *cmd;	//用户输入的原始命令,用于显示(如jobs命令显示的用户执行的后台任务)
	SingleCmd **cmds;	//SingleCmd(单个命令)的数组
	char *input;	//输入重定向
	char *output;	//输出重定向
}




SingleCmd{
	char *program; //execv的第一个参数,命令路径,如/bin/echo
	char **args     //命令的参数列表
	int pid		//命令的pid
}




例子:echo aaa | cat | cat
Cmd{
	isBack:0;
	cmdCount:3;
	cmd:"echo aaa | cat | cat";
	SingleCmd = {echo aaa,cat,cat}
	input:null;
	output:null
}




Job结构改为(至少有这几项),书上是用链表实现的
typedef struct Job{
	int pgid;	//进程组编号(jobid)
	char cmd[100]	//命令名
	char state[100]	//作业状态
	Cmd* cmd;
}




要实现的函数
addJob(Cmd* cmd)	//把一个cmd加入后台Job工作队列
removeJob(pgid)		//根据job的pgid删除job
getJob(pgid)	//返回指定pgid的job
setSingleCmdState(pgid,pid)	//将pgid的job中,singleCmd.pid==pid的singleCmd.pid置为-1(表示他运行完了)
checkSingleCmdState(pgid)	//检查pgid的job是否执行完(所有singleCmd.pid都为-1)
copyCmd(Cmd *cmd)	//从job中复制cmd(拷贝一份),返回新的拷贝
重写execSimpleCmd下的 jobs 子命令


你可能感兴趣的:([操作系统实验] Todolist)