注意前提条件:全部代码都必须在Linux 中运行!!!
一、进程的创建:编写一段程序,使用系统调用 fork()创建两个子进程。当此程序运行时,在系统 中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”; 两子进程分别显示字符“b”和字符“c”。
步骤 1:使用 vi 或 gedit 新建一个 fork_demo.c 程序,然后拷贝清单 2-1 中的程序,使用 cc 或者gcc 编译成可执行文件 fork_demo。例如,可以使用 gcc –o fork_demo fork_demo.c 完成编译。
#include <sys/types.h> #include <stdio.h> #include <unistd.h> int main () { int x; while((x=fork()) == -1); if (x==0){ x=fork(); if(x>0) printf("b"); else printf("c"); } else printf("a"); } • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12 • 13 • 14 • 15 • 16 • 17
二、实现一个简单的 shell(命令行解释器):要设计的 shell 类似于 sh,bash,csh 等,必须支持以下内部命令:
1、cd <目录>更改当前的工作目录到另一个<目录>。如果<目录>未指定,输出当前工作目录。如
果<目录>不存在,应当有适当的错误信息提示。这个命令应该也能改变 PWD 的环境变量。
2、environ 列出所有环境变量字符串的设置(类似于 Unix 系统下的 env 命令)。
3、echo <内容 > 显示 echo 后的内容且换行
4、help 简短概要的输出你的 shell 的使用方法和基本功能。
5、jobs 输出 shell 当前的一系列子进程,必须提供子进程的命名和 PID 号。
6、quit,exit,bye 退出 shell。
#include<stdio.h> #include<string.h> #include<sys/types.h> #include<unistd.h> int main() { char cmd[666]; char cata[100]; while(1) { int len,i,flag,cnt; printf("Enter commands:"); // print String scanf("%s",cmd); // Calculation String len = strlen(cmd); // for cd if(cmd[0]=='c') { flag=0; cnt=0; // Start after command for(i=3; i<len-1; i++) { // String is not null if(cmd[i]!=' ') flag=1; if(flag) { cata[cnt++] = cmd[i]; } } // String is null if(cnt==0) { printf("path error!\n"); cata[0]='.'; cata[1]='\0'; } } //for echo if(cmd[0]=='e'&&cmd[1]=='c') { flag = 0; for(i=5; i<len-1; i++) { if(cmd[i]!=' ') flag=1; if(flag) { putchar(cmd[i]); } } if(flag) putchar('\n'); } // for help if(cmd[0]=='h') { printf("/**********Method***********/\n"); printf("print cd<catalog> :find directory\n"); printf("print environ :List set\n"); printf("print echo<content> : print content\n"); printf("print help :List Method\n"); printf("print jobs :provide PID\n"); printf("print quit,exit,bye :break \n"); printf("/******Method***************/\n"); } // for quit,exit,bye if(cmd[0]=='q'||cmd[1]=='x'||cmd[0]=='b') { printf("break\n"); return 0; } else { cnt=0; // child process pid_t pid = fork(); if(pid<0) { // error occurred fprintf(stderr,"Fork Failed" ); return 1; } else if(pid==0) { //cd if(cmd[0]=='c') { execlp("/bin/ls",cata,NULL); } //jobs else if(cmd[0]=='j') { execlp("pstree","-p",NULL); } //environ else if(cmd[1]=='n') { execlp("env","",NULL); } } else { //wait child process exit wait(); } } printf("\n"); } return 0; }