版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
注意前提条件:全部代码都必须在Linux 中运行!!!
一、进程的创建:编写一段程序,使用系统调用 fork()创建两个子进程。当此程序运行时,在系统 中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”; 两子进程分别显示字符“b”和字符“c”。
步骤 1:使用 vi 或 gedit 新建一个 fork_demo.c 程序,然后拷贝清单 2-1 中的程序,使用 cc 或者gcc 编译成可执行文件 fork_demo。例如,可以使用 gcc –o fork_demo fork_demo.c 完成编译。
步骤 2:在命令行输入./fork_demo 运行该程序。
代码:
#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");
}
运行结果如下图:
二、实现一个简单的 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;
}