目录
1.bash:
linux bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令;Bash还能从文件中读取命令,这样的文件称为脚本;和其他Unix shell一样,它支持文件名替换、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。
bash的命令语法是Bourne shell命令语法的超集。
bash实质上是一个可执行程序,一个用户的工作环境。
bash的功能一是可以记入历史命令,第二呢,可以用tab键自动补全。第三。alias命令别名,第四呢,工作控制,可以将某些任务放到后台去运行。再一个是程序脚本就是可以执行shell脚本文件。还有通配符以及内建命令type。
2.fork+exec()例1:
利用bash创建ps命令
利用bash创建ps命令----execl的使用(结合fork)
fork+exec()是Linux上创建新进程方式;
//(1)main.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<sys/wait.h>
int main()
{
printf("main pid=%d,ppid=%d\n",getpid(),getppid());
pid_t pid=fork();
assert(pid!=-1);
if(pid==0)
{
printf("chilr pid=%d,ppid=%d\n",getpid(),getppid());
execl("/usr/bin/ps","ps","-f",NULL);
printf("excel error");
exit(0);
}
wait(NULL);
exit(0);
}
3.fork+exec()例子2:
当前主程序复制产生一个子进程,子进程用新程序(b)替换自身;
//(2)main2.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<errno.h>
#include<sys/wait.h>
int main(int argc,char *argv[],char *envp[])
{
printf("main pid=%d\n",getpid());
pid_t pid=fork();
assert(pid!=-1);
if(pid==0)
{
char *myargv[]={"b","hello","abc","123",(char *)0};
execve("./b",myargv,envp);
perror("execl error");
exit(0);
}
wait(NULL);
printf("main over\n");
exit(0);
}
(3)
//b.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
int main(int argc,char *argv[],char *envp[])
{
printf("b pid=%d\n",getpid());
int i=0;
printf("argc=%d\n",argc);
for(;i<argc;i++)
{
printf("argv[%d]=%s\n",i,argv[i]);
}
for(i=0;envp[i]!=NULL;i++)
{
printf("envp[%d]=%s\n",i,envp[i]);
}
exit(0);
}
./main2