Linux_C smsh1

这是一个模拟shell端的程序。

使用了execvp,fork,wait,malloc,realloc以及strtok()函数。

smsh.h

1 char* next_cmd();
2 char** splitline(char* );
3 void freelist(char **);
4 int execute(char** );

smsh1.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <signal.h>
 5 #define DFL_PROMPT ">:"
 6 int main(){
 7   char * cmdline, *prompt, **arglist;
 8   int i;
 9   void setup();
10   prompt = DFL_PROMPT;
11   setup();
12   while((cmdline=next_cmd(prompt, stdin)) != NULL ){
13     if((arglist=splitline(cmdline))!=NULL){
14       for(i=0; i<2; i++)
15     printf("%s  ", arglist[i]);
16       printf("\n");
17       printf("will execute.\n");
18       execute(arglist);
19       freelist(arglist);
20     }
21     free(cmdline);
22   }
23
24   return 0;
25 }
26 void setup(){
27   /*
28    * purpose: initialize shell
29    * 在shell中忽略信号SIGINT&SIGQUIT, 但是在子进程中恢复对
30    * SIGINT&SIGQUIT的默认操作,允许用户通过按表示结束多文件多Ctrl-D来退出
31    */
32   signal(SIGINT, SIG_IGN);
33   signal(SIGQUIT, SIG_IGN);
34 }

splitline.c

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include "smsh.h"
 5
 6 char* next_cmd(char* prompt, FILE *fp){
 7   /*
 8    * purpose: read next command line from fp
 9    * return: dynamically allocated string holding command line
10    * note: allocates space in BUFSIZ chunks.其中BUFSIZ是库函数中define过了的
11    */
12   char* buf;
13   int bufspace = 0;
14   int pos = 0;
15   int c;
16   //printf("%s", prompt);
17   while((c=getc(fp)) != EOF) {
18     if(pos+1>=bufspace) {
19       if(bufspace==0)
20     buf = malloc(BUFSIZ);
21       else
22     buf = realloc(buf, bufspace+BUFSIZ);
23       bufspace+=BUFSIZ;
24     }
25     if(c==‘\n‘)
26       break;
27     buf[pos++]=c;
28   }
29   if(c==EOF || pos==0)
30     return NULL;
31   buf[pos]=0;
32   //printf("u cin is end.\n");
33   return buf;
34 }
35
36 char** splitline(char* cmdline){
37   /*
38    * purpose: split a line
39    * note:注意:在最后一次给arglist赋值时,也就是strtok()返回为NULL的时候,也需要给
40    *            arglist[i]=malloc(sizeof(char*));一下,即使最后赋的为NULL也需要分配一个指针空间给它。
41    */
42   char **arglist;
43   char *delim=" ";
44   char *cmdbuf;
45   int i=1;
46   cmdbuf=strtok(cmdline,delim);
47   //printf("cmdbuf0: %s\n", cmdbuf);
48   arglist = malloc(sizeof(char*));
49   arglist[0]=malloc(strlen(cmdbuf)*sizeof(char));
50   strcpy(arglist[0], cmdbuf);
51   while((cmdbuf=strtok(NULL, delim))) {
52     arglist = realloc(arglist, (1+i)*sizeof(char*));
53     arglist[i]=malloc(strlen(cmdbuf)*sizeof(char));
54     strcpy(arglist[i], cmdbuf);
55     //printf("cmdbuf%d: %s\n",i,cmdbuf);
56     i++;
57   }
58   arglist[i]=malloc(sizeof(char*));
59   arglist[i]=NULL;
60   return arglist;
61 }

execute.c

 1 /* execute.c- code used by small shell to execute commands
 2  */
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include <unistd.h>
 6 #include <signal.h>
 7 #include <sys/wait.h>
 8
 9 int execute(char** arglist){
10   /*
11    *purpose: run a program passing it arguments;
12    *return: status returned via wait, or -1 on error
13    *errors: -1 on fork() on wait() errors
14    */
15   int pid;
16   int child_info = -1;
17   printf("now its go into the function execute\n");
18   if((pid=fork()) == -1)
19     perror("fork");
20   else if(pid == 0) {
21     signal(SIGINT, SIG_DFL);
22     signal(SIGQUIT, SIG_DFL);
23     execvp(arglist[0], arglist);
24     perror("cannot execute command");
25     exit(1);
26   }
27   else {
28     if(wait(&child_info) == -1)
29       perror("wait");
30   }
31   return child_info;
32 }
33 void freelist(char** list) {
34   /*
35    *purpose: free the list returned by splitline
36    *returns: nothing
37    *actoin: free all strings in list and then free the list
38    */
39   char **cp=list;
40   while(*cp)
41     free(*cp++);
42   free(list);
43 }
时间: 2024-10-06 08:48:48

Linux_C smsh1的相关文章

Linux_C smsh2(if,then,else)

在smsh1的基础上,只是增加了一层process(),以之来处理if,then,else. smsh.c 只是更变了一行rv=process(); 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <signal.h> 5 #include "smsh.h" 6 7 #define DFL_PROMPT ">:"

linux_c 开发(5-6)进程间通讯_信号量

进程间通信_信号量 信号量(有名:信号灯)与其他进程间通信方式不大相同,主要用途是**保护临界资源**.进程可以根据它判断是否能够访问某些共享资源.除了用于访问控制外,还可以用于**进程同步**. 分类 二值信号灯:信号灯的取值只能取0或者1,类似于互斥所.但两者有不同:信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值:互斥所更加强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁. **计数信号灯:** 信号灯的值可以取任意非负值. **创建/打开** #includ

Linux_C socket 数据报之client, server.c

dgrecv.c 1 /**************************************************************** 2 * dgrecv.c - datagram receiver 3 * usage: dgrecv portnum 4 * action: listens at the specfied port and reports messages 5 */ 6 #include <stdio.h> 7 #include <stdlib.h&g

Linux_C socket 数据报之一些辅助函数

1 /******************************************************************** 2 * dgram.c 3 * support functions for datagram based programs 4 */ 5 #include <stdio.h> 6 #include <unistd.h> 7 #include <sys/types.h> 8 #include <sys/socket.h>

Linux_C 进程间共享管道

程序pipe, 它使用可例如: ./pipe who sort   ./pipe ls head 1 /* pipe.c 2 * Demostrates how to create a pipeline from one process to another 3 * * take two args, each a command ,and connects 4 * argv[1]s output to intput of argv[2] 5 * effect: command1 | comman

Linux_C 输入输出重定向

将stdin定向到文件有3种方法: 1.close then open .类似挂断电话释放一条线路,然后再将电话拎起来从而得到另一条线路. 先close(0);将标准输入关掉,那么文件描述符数组中的第一个元素处于空闲状态.(一般数组0=stdin, 1=stdout, 2=stderror,如果不关闭那么进程请求一个新的文件描述符的时候系统内核将最低可用的文件描述符给它,那么就是2以后的元素,关掉0,就分配了0给新进程). close(0);  fd=open("/etc/passwd"

Linux_C bc/利用2根管道让2进程通讯

1 /* tingbc.c 2 * use two pipe to execute the bc. 3 * one pipe: todc[2] , another: fromdc[2] 4 * child thread to do dc, parent do UI 5 */ 6 7 #include <stdio.h> 8 #include <unistd.h> 9 #include <string.h> 10 #define oops(x, n) {perror(x)

Linux_C dup()

1 /* 2 * stdinredir2.c 3 * shows two more methods for redirecting standard input 4 * use #define to set one or the other 5 */ 6 #include <stdio.h> 7 #include <fcntl.h> 8 /*#define CLOSE_DUP /*open, close, dup, close */ 9 /*#define USE_DUP2 /*o

Linux_C socket 服务器与客户端交互程序(输入小写转换为大写)

client.c 1 /* interactionSocket/client.c 2 * 实现终端与服务器端的交互式输入输出 3 */ 4 #include <stdio.h> 5 #include <stdlib.h> 6 #include <string.h> 7 #include <unistd.h> 8 #include <sys/types.h> 9 #include <sys/socket.h> 10 #include &