编写一个简易shell命令行
用fork()创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。
进程程序替换:替换数据和代码,执行不同逻辑,一旦替换之后,父,子进程代码,数据独立。
主要是创建进程,让子进程去执行命令。
主要有6个调度函数,函数名中p表示传文件名(靠环境变量来看是否存在PATH),没p的需把文件路径传过来,要执行一个程序必须先找到它.
带e表示用自定义环境变量,不带e表示从父进程继承而来的环境变量。
#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>intmain(intargc,char*argv[]){pid_tid;while(1){printf("[lxj/home]$");fflush(stdout);charcmd_str[1024]={0};ssize_tsize=read(0,cmd_str,sizeof(cmd_str)-1);charcmd[32]={0};char*my_argv[32];memset(my_argv,0,sizeof(char*)*32);intlength=strlen(cmd_str)-2;//printf("%s",cmd_str);if(size!=-1){intindex=0;while(length>=0){while(length>=0&&cmd_str[length]==''){cmd_str[length--]=0;}while(length>=0&&cmd_str[length]!='')length--;my_argv[index++]=cmd_str+length+1;}my_argv[index]=NULL;inti=0;index--;for(;i<index;++i,--index){char*tmp=my_argv[i];my_argv[i]=my_argv[index];my_argv[index]=tmp;}if(strcmp(argv[0],"cd")==0){chdir(my_argv[1]);continue;}}id=fork();if(id<0)perror("fork");elseif(id==0){execvp(my_argv[0],my_argv);exit(1);}elseif(id>0){pid_twaitPid=waitpid(id,NULL,0);}}return0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。