@1405010312
2016-04-27T14:41:42.000000Z
字数 2392
阅读 617
linux进程管理
报告提交日期:2016.4.27 报告截止日期:2016.4.28
姓名:肖罗罗 学号:1405010312 班级:计算机三班
- 实现一个简单的shell
- 通过进程的创建、撤销和运行加深对进程概念和进程并发执行的理解,明确进程和程序之间的区别
virtualbox下的linux mint17.3的虚拟环境
1. 在 Linux 中创建子进程要使用 fork()函数,执行新的命令要使用 exec()系列函数,等待子进 程结束使用 wait()函数,结束终止进程使用 exit()函数。
2.fork 建立一个子进程,父进程继续运行,子进程在同样的位置执行同样的程序。对于父进程, fork()返回子进程的 pid, 对于子进程,fork()返回 0。出错时返回-1。
3.exec 系列有 6 个函数,原型如下:
1. int execl( const char *path, const char *arg, ...);
2. int execlp( const char *file, const char *arg, ...);
3. int execle( const char *path, const char *arg , ..., char * const envp[]);
4. int execv( const char *path, char *const argv[]);
5. int execve (const char *filename, char *const argv [], char *const envp[]);
6. int execvp( const char *file, char *const argv[]);
代码1-1
#include<stdio.h>
#include<unistd.h>
#include<wait.h>
#include<sys/types.h>
#include<error.h>
#include<errno.h>
#include<stdlib.h>
#include<string.h>
#include<pwd.h>
const int maxn = 150;
int num;
char* p;
void setup(char op[], char *argv[]){
int i, j;
i = 0;
for(p = op; ;p++){
argv[i++] = p;
while(*p != ' ' && *p != '\0') p++;
if(*p == '\0') break;
*p = '\0';
}
num = i;
argv[i] = NULL;
}
void showhelp(){
printf("help\n");
printf("cd<目录> : 更该当前目录到其他<目录>\n");
printf("echo<内容> : 复制内容\n");
printf("help : shell的使用方法和基本功能\n");
printf("jobs : 输出shell当前一系列子进程\n");
printf("quit,exit,bye : 退出shell\n");
}
void showecho(char* argv[]){
int i;
for(i = 1; i < num; i++){
printf("%s", argv[i]);
if(i != num-1) printf(" ");
}
printf("\n");
}
void showjobs(char* argv[]){
if(fork() == 0){
if(execlp("ps", "-1", NULL) == -1)
fprintf(stderr, "exec %s failed: %s\n", argv[0], strerror(errno));
exit(1);
}
}
int main(){
char op[maxn];
char *argv[maxn/2-1];
while(1){
gets(op);
setup(op, argv);
if(num == 0) continue;
if(!strcmp(argv[0],"quit") || !strcmp(argv[0],"exit") || !strcmp(argv[0],"bye")) break;
if(!strcmp(argv[0], "help")){showhelp(); continue;}
if(!strcmp(argv[0], "echo")){showecho(argv); continue;}
if(!strcmp(argv[0], "cd")){chdir(argv[1]); continue;}
if(!strcmp(argv[0], "jobs")){showjobs(argv); wait(NULL); continue;}
if(!strcmp(argv[0], "environ")) argv[0] = "env";
if(fork() == 0){
if(execvp(argv[0], argv) == -1)
fprintf(stderr, "exec %s failed: %s\n", argv[0], strerror(errno));
exit(1);
}
wait(NULL);
}
return 0;
}