mybash的实现
mybash的实现题目要求 2.写出伪代码,产品代码和测试代码 3.发表知识理解,实现过程和问题解决的博客(包含代码托管链接) fork()man -k fork命令 man 2 fork fork函数: #include <sys/types.h> #include <unistd.h> pid_t fork(void); //返回:子进程返回0,父进程返回子进程的PID,如果出错,则返回-1。 一般来说,运行一个C程序直到该程序全部结束,系统只会分配一个PID给这个程序,也就是说,系统里只有一条关于这个程序的进程。但执行了fork函数就不同了。fork()的作用是复制当前进程(包括进程在内存的堆栈数据),然后这个新的进程和旧的进程一起执行下去。而且这两个进程是互不影响的 代码 #include <sys/types.h> #include <unistd.h> int main(){ printf("step 1nn"); fork();//创建一个新的进程 printf("after fork()nn"); int i; scanf("%d",&i);//防止程序退出 return 0; } execman -k program | grep execute命令 man -k execute命令 exec的参数分成3个部分:执行文件,命令参数,和环境变量。 假如要执行:ls -l /etc 执行文件部分就是:"/usr/bin/ls" e:参数必须带环境变量部分,环境变量部分参数会成为执行exec函数期间的环境变量; l:命令参数部分必须以"," 相隔,最后1个命令参数必须是NULL; v:命令参数部分必须是1个以NULL结尾的字符串指针数组的头部指针。例如char * pstr就是1个字符串的指针,char * pstr[] 就是数组了,分别指向各个字符串; p:执行文件部分可以不带路径,exec函数会在$PATH中找。 代码 #include <unistd.h> int main() { char *argv[] = {"ls",".",(char *)0}; printf("···Begin to Show ls -l···n"); execvp("ls",argv); printf("···ls -l is done! ···"); return 0; } wait()一个进程可以通过调用wait函数来等待它的子进程终止或者停止。 man -k wait man 2 wait wait()的使用方法可以用下面的代码表示: #include <sys/types.h> #include <unistd.h> pid_t wait(int *status); //返回:如果成功,则返回子进程的PID,如果出错,则返回-1。 父进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。 wait()要与fork()配套出现,如果在使用fork()之前调用wait(),wait()的返回值则为-1,正常情况下wait()的返回值为子进程的PID。 如果先终止父进程,子进程将继续正常进行,只是它将由init进程(PID 1)继承,当子进程终止时,init进程捕获这个状态。 编程实现mybash 伪代码如下 int main(){ 读取要执行的命令 使用fork()函数产生子进程进行执行 如果exec函数产生了返回值,表明没有正常执行命令,输出perro() 父进程等待子进程结束,并输出值wait(&rtn) } #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <limits.h> void main() { char *command[3]; command[0] = "ls"; command[1] = "-l"; command[2] = 0; int s,i=0; int rtn; printf( ">" ); //printf("%s %s %s",command[1],command[2],command[3]); printf("%s",command[0]); i=0; s=fork(); if ( s== 0 ) { //printf("%dn",s); execvp( command[0],command ); //perror( command ); exit( errno ); } else { //printf("%dn",s); wait ( &rtn ); printf( " child process return %dn",rtn ); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |