linux下使用系统调用模拟SHELL

原创 2004年09月22日 09:10:00

结构还算清晰,昨天的blog里已经大致说过了,不多解释了

RTFSC  :)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <wait.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
#include <errno.h>

typedef struct command_struct{
  int comargc; 
  char* command;
  char* comargv[10];
}command_struct;

int com_inside(char*);
int search(char*,char*,char*);

int main(int argc,char** argv)
{
  int flag;
  int i,c;
  int m,n;
  int * status;
  char cwd[255];
  int exeflag;
  char tempcom[10];
  char full_pathname[64]="/home/yg/c_test/0921";
  char pathname[64];
  char scanargv[10][10]={};
  command_struct com;
  while(1)
    {
      if((int)getcwd(cwd,64)==-1)
 printf("get cwd error");
      printf("%s>",cwd);
      /*begin init command_struct*/
      for(m=0;m<10;m++)
 {
   for(n=0;n<10;n++)
     {
       scanargv[m][n]=0;
     }
 }
      i=0;
      while((c=getchar())!='/n')
 {
   if(c!=' ')
     {
       scanargv[i][0]=c;
       scanf("%s",scanargv[i++]+1);
     }
   else
     {
       scanf("%s",scanargv[i++]);
     }
 }
      com.comargc=i-1;
      com.command=scanargv[0];
      i=0;
      while(i<10)
 {  
   com.comargv[i]=scanargv[i];
   i++;
 }  
      /*end init command_struct*/     
      if(com.command=="/n")continue;     
      if((strcmp(com.command,"quit")==0)||(strcmp(com.command,"exit")==0))exit(1);     
      if((flag=com_inside(com.command))==-1)exit(1);
      else if(flag==1)continue;
      else if(flag==0)
 {
   strcpy(tempcom,com.command);  
   if((exeflag=search(full_pathname,tempcom,pathname))==0)
     printf("Bad command or file name/n");
   else
     {      
       if(fork()==0)
      {
    i=0;
    while(i<=com.comargc)
      {
        argv[i]=com.comargv[i];       
        i++;
      }
    if(execve(pathname,argv,0)==-1)
      {
        printf("error is %s/n",strerror(errno));
      }
      }
       else
      {
    wait(status);
      }
     }
 }
    }
  return 1;
}

 

int com_inside(char* command)
{
  if(command==NULL)return -1;
  if(!(strcmp(command,"ok")))
    {
      printf("OK/n");
      return 1;
    }
  if(!(strcmp(command,"ver")))
    {
      printf("0.0.0.1/n");
      return 1;
    }
  return 0;
}

 

int search(char* path,char* name,char* full_pathname)
{
  int flag;
  int i;
  char pathname[64]={};
  DIR * dirp;
  struct dirent * direntp;
  strcpy(pathname,path);
  i=0;
  while(pathname[i]!=0)
    {
      i++;
    }
  if(pathname[i-1]!=47)
    {
      strcat(pathname,"/");
    }
  if((dirp=opendir(path)))
    {
      while((direntp=readdir(dirp))!=NULL)
 {
   if(strcmp(direntp->d_name,name)==0)
     {
       flag=1;
       break;
     }
   else flag=0;
 }
      closedir(dirp);     
      if(flag)
 {
   strcat(pathname,name);
   strcpy(full_pathname,pathname); 
   return 1;
 }
      else return 0;
    }
  else
    {
      return 0;    
    } 
}

 

shell学习五十四天----进程系统调用的追踪strace

strace 前言:strace常用来跟踪进程执行时的系统调用的所接受的信号.在linux世界,进程是不能直接访问硬件设备,当进程需要访问硬件(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模...
  • shanyongxu
  • shanyongxu
  • 2015年07月29日 11:00
  • 2706

Linux下简单的系统调用

嵌入式汇编实现简单的系统调用
  • ven_kon
  • ven_kon
  • 2017年03月17日 21:31
  • 257

Linux中open、write、read、close系统调用

个人学习整理 如有不足之处 请不吝指教 open系统调用 open函数的三个参数: (1)path是已经存在的文件的路径; (2)oflags参数:若值为 O_RDONLY ,就以只读方式...
  • MOON5555
  • MOON5555
  • 2017年11月01日 11:27
  • 154

[GNU/Linux] Linux系统调用-线程相关(一):基本知识

线程包含的信息:每个线程中都包含有表示自身执行环境的信息,其中至少包括:标识线程的线程ID、一组寄存器的值、栈、调度优先级和策略、信号屏蔽字、errno变量和线程的私有数据。 线程函数的错误处理...
  • hepangda
  • hepangda
  • 2017年07月25日 19:16
  • 251

使用readdir系统调用模拟shell ls功能

使用readdir系统调用模拟shell ls功能
  • Coolyqq
  • Coolyqq
  • 2016年08月08日 11:33
  • 392

Linux下添加系统调用实例

  • wanxiao009
  • wanxiao009
  • 2010年03月30日 20:05
  • 3106

linux 系统调用劫持

linux 系统调用劫持 分类: linux 编程2009-09-19 11:50 2069人阅读 评论(5) 收藏 举报 linuxtablemodulesystemstru...
  • stonesharp
  • stonesharp
  • 2014年03月24日 09:30
  • 1609

GEM5中模拟的系统调用(部分没实现)

1.全部系统调用 "syscall", // 0 37 "exit", // 1 38 "fork", // 2 39 "read", // 3 40 "write", // 4 41...
  • stupid_haiou
  • stupid_haiou
  • 2015年05月24日 17:07
  • 827

linux shell数组操作

1、定义数组 说明:一对括号表示是数组,数组元素用“空格”符号分割开。 实例: [test@test]$ a=(1 2 3 4 5) [test@test]$ echo $a 1 2、读取数组元素 形...
  • wangjin2891
  • wangjin2891
  • 2016年06月17日 15:29
  • 263

LINUX下通过系统调用的文件操作

相比较标准库函数(fopen、fread、fwrite…)的方式,系统调用的方式只能在类Unix系统下使用,而且,使用系统调用是不带缓冲机制的。 一、缓冲机制: ①.完全缓冲:只有数据超过缓冲区大小时...
  • prim_learn
  • prim_learn
  • 2016年12月26日 18:13
  • 150
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux下使用系统调用模拟SHELL
举报原因:
原因补充:

(最多只允许输入30个字)