0. 相关博客
实现一个管道通信程序_ 一只博客-CSDN博客_实现一个管道通信程序https://blog.csdn.net/qq_42276781/article/details/98523996利用Linux的消息队列通信机制实现两个线程间的通信_ 一只博客-CSDN博客_杭电操作系统实验三https://blog.csdn.net/qq_42276781/article/details/90672038利用Linux的共享内存通信机制实现两个进程间的通信_ 一只博客-CSDN博客_利用linux的共享内存通信机制实现两个进程间的通信https://blog.csdn.net/qq_42276781/article/details/98519201
1. 实现一个模拟的shell
编写三个不同的程序cmd1.c、cmd2.c及cmd3.c,每个程序的功能自定,分别编译成可执行文件cmd1、cmd2、cmd3.然后再编写一个程序,模拟shell程序的功能:能根据用户输入的字符串(表示相应的命令名),为相应的命令创建子进程并让他去执行相应的程序,而父进程则等待子进程结束,然后再接收下一条命令。如果接收到的命令为exit,则父进程结束,退出模拟shell;如果接收到的命令是无效命令,则显示“Command not found”,继续等待输入下一条命令。
2. 原代码
无bug,可正常运行
3. 图片识别结果
有bug,无法直接运行,调试改bug过程中可以加深代码理解
test1.c文件
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void childprocess(int num,char * const argv[],char ** environ){
pid_t pid=fork();
if(pid<0)
printf("Create child process failed \n");
else if(pid==0){
switch(num){
case 1:execve("cmd1",argv,environ);
case 1:execve("cmd2",argv,environ);
case 1:execve("cmd3",argv,environ);
default:printf("process will never go here");
}
}
}
int main(int argc,char * const argv[], char **environ){
char a[10];
while(1){
fgets(a,10,stdin);
if (strcmp(a,"exit\n")==0) break;
else if (strcmp(a,"cmd1\n"==0)){
childprocess(1,argv,environ);
}
else if (strcmp(a,"cmd2\n"==0)){
childprocess(2,argv,environ);
}
else if (strcmp(a,"cmd3\n"==0)){
childprocess(3,argv,environ);
}
else printf("Command not found\n");
}
}
cmd1.c、cmd2.c和cmd3.c内容随意,但是要和test1.c放在同一目录下。
4. 代码及实验报告获取
关注公众号,回复“进程管理”即可获取代码及实验报告