在Linux下利用替换函数(exec函数家族)写一个简单的myshell

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/wait.h>

#include <unistd.h>

void swap(char **p,char **q)

{

char *tmp=*p;

*p=*q;

*q=tmp;

}

int main(int argc,char *argv[])

{

pid_t id;

while(1){

printf("[[email protected] fangfang]# ");

fflush(stdout);

char cmd_str[1024];

memset(cmd_str,‘\0‘,sizeof(cmd_str));

ssize_t size=read(0,cmd_str,sizeof(cmd_str)-1);

if(size>=0){

cmd_str[size-1]=‘\0‘;

}

char *my_argv[32];

int index=0;

int len=strlen(cmd_str)-1;

while(len-->0){

if(cmd_str[len]==‘ ‘ && (cmd_str[len+1] ==‘ ‘|| cmd_str[len+1]==‘\0‘)){

len--;

}else if(cmd_str[len]==‘ ‘){

my_argv[index++]=&cmd_str[len+1];

cmd_str[len]=‘\0‘;

}

}

if(cmd_str[0]!=‘ ‘)

{

my_argv[index++]=cmd_str;

my_argv[index]=‘\0‘;

}

int j=index-1;

int i=0;

while(i<j){

swap(&my_argv[i++],&my_argv[j--]);

}

// for(i=0;i<index;++i)

// {

// printf("%s\n",my_argv[i]);

// }

if(strcmp("cd",my_argv[0]==0)){

chdir(my_argv[1]);

continue;

}

id=fork();

if(id<0){

perror("fork");

exit(1);

}else if(id==0){

execvp(my_argv[0],my_argv);

exit(1);

}else{

pid_t _wait_pid=waitpid(id,NULL,0);

if(_wait_pid==id){

//DO NOHANG

}

}

}

return 0;

}

这只是一个简单的shell,如果需要更好的使用还需完善bash等的功能。

时间: 2024-10-19 18:13:37

在Linux下利用替换函数(exec函数家族)写一个简单的myshell的相关文章

linux设备驱动第三篇:如何写一个简单的字符设备驱动?

在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存. 下面就开始学习如何写一个简单的字符设备驱动.首先我们来分解一下字符设备驱动都有那些结构或者方法组成,也就是说实现一个可以使用的字符设备驱动我们必须做些什么工作. 1.主设备号和次设备号 对于字符设备的访问是通过文件系统中的设备名称进行的.他们通常位于/dev目录下.如下: [email prot

Linux下利用signal函数处理ctrl+c等信号

前言 linux下可以通过信号机制来实现程序的软中断,是一个非常有用的编程方法.我们平时在程序运行的时候按下ctrl-c.ctrl-z或者kill一个进程的时候其实都等效于向这个进程发送了一个特定信号,当进程捕获到信号后,进程会被中断并立即跳转到信号处理函数.默认情况下一个程序对ctrl-c发出的信号(SIGINT)的处理方式是退出进程,所以当我们按下ctrl-c的时候就可以终止一个进程的运行. signal函数 但是有时候我们希望我们的程序在被信号终止之前执行一些特定的收尾流程,或者我们希望我

linux下的fork和execve函数使用

fork函数是linux中创建进程的函数,linux创建进程只有用fork,别无他法.我自己写代码fork用的不多,对它的一些细节还不是清楚,今天抽空研究了下fork,把它的一些关键点总结一下,以后用到了自己也好有个参考. 1)fork函数会在父进程中创建子进程,子进程的堆,栈,数据段,PC指针都是从父进程中复制过来的,和父进程是独立的,但是内容是一致的.代码段子进程和父进程是共享的. 2)fork()的返回值可能为-1,0,和一个正数.-1表示fork()调用失败,0表示返回子进程执行结果,正

Linux 下使用C语言 gets()函数报错

在Linux下,使用 gets(cmd) 函数报错:warning: the 'gets' function is dangerous and should not be used. 解决办法:采用 fgets(cmd,100,stdin);//100为size 问题解决! fgets从stdin中读字符,直至读到换行符或文件结束,但一次最多读size个字符.读出的字符连同换行符存入缓冲区cmd中.返回指向cmd的指针. gets把从stdin中输入的一行信息存入cmd中,然后将换行符置换成串结

Linux下的目录扫描操作函数使用实践

[文章摘要] 本文以实际的C源程序为例子,介绍了Linux下的目录扫描函数(scandir)的使用方法,为相关开发工作的开展提供了有益的参考. [关键词] C语言  Linux  目录扫描  makefile  scandir 一.scandir命令简介 scandir函数的声明为: int scandir(const char *dir, structdirent ***namelist, int (*filter) (const void *b), int ( * compare )( co

linux下利用echo命令输出带颜色以及带字体格式的字符串

echo输出颜色字体:格式 例: echo  –e  "\033[31m被改变字体颜色的字符\033[0m" 其中\033[31m开始, *其中31(3开头控制前景色)中的1是红色,将此数值替换为2是绿色,3棕色,4蓝色,5紫色,6青绿色 *背景色控制由4开头的字符串 *单字符设置字体(1为粗体:4为下划线:5为闪烁:7反转前景色.背景色) 例:36:41:1 \033[0m结束 格式如下(#号代表数字,其中3#;4#;#可以只写一项或几项!一定要有结束字符,否则终端以后显示的字符都是

Linux下利用Ret2Libc绕过DEP

Linux下利用Ret2Libc绕过DEP ⑴.  原理分析: 系统库函数通常是不受DEP(关于DEP,可以查看我之前文章的详细介绍)保护的,所以通过将返回地址指向系统函数可以绕过DEP保护,所以可以通过调研系统函数system()获得shell. ⑵.环境准备: i.漏洞代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> void flow()

Linux下 批量替换文件内容方法和odoo替换谷歌字体

#odoo#用中科院CDN解决odoo用到google字体速度慢问ti Linux下批量替换文件内容方法 http://www.cnblogs.com/fjping0606/p/4428850.html 1:查找find . -type f -name "*.html"|xargs grep 'yourstring' 2:查找并替换find -name '要查找的文件名' | xargs perl -pi -e 's|被替换的字符串|替换后的字符串|g' perl -pi -e在Per

Linux下利用nginx实现负载均衡

linux下利用nginx实现负载均衡 前提条件: 1,安装好jdk 2,安装好tomcat和nginx(可以参考我前两篇文章) 满足前提条件后,要用nginx实现负载均衡,主要是靠配置nginx的配置文件. 我们要实现的架构图如下: 1.分别部署3个tomcat,端口分别为8080,8081,8082 drwxr-xr-x 9 root root 4096 Mar 11 13:41 tomcat8-8080drwxr-xr-x 9 root root 4096 Mar 11 17:27 tom