所有进程的创建都可以是:fork+execel,先将bash本身赋值,然后替换为要执行的程序。
stu@stu-virtual-machine:~/Test/替换举例$ ps
PID TTY TIME CMD
3386 pts/0 00:00:00 bash
10948 pts/0 00:00:00 ps
stu@stu-virtual-machine:~/Test/替换举例$ ps -f
UID PID PPID C STIME TTY TIME CMD
stu 3386 3374 0 14:34 pts/0 00:00:00 bash
stu 10949 3386 0 15:31 pts/0 00:00:00 ps -f
1 #include<stdio.h>
2 #include<assert.h>
3 #include<unistd.h>
4 #include<stdlib.h>
5 int main(int argc,char*argv[],char*envp[])
6 {
7 printf("main pid=%d\n",getpid());
8 //execl执行成功不返回值,不成功返回错误码。
9 // execl("/usr/bin/ps","ps","-f",(char*)(0));
10 // execlp("ps","ps","-f",(char*)(0));//不用给路径都能找出来这个进程
11 // execle("/usr/bin/ps","ps","-f",(char*)0,envp);
12 char* arg[10]={"ps","-f"};
13 /* execv("/usr/bin/ps",arg);*///arg用来存储参数的地址
14 // execvp("ps",arg);
15 execve("/usr/bin/ps",argv,envp);
16 perror("execl error");
17 exit(0);
18 }
~
前面的几种就是调用execve
main pid=2863
UID PID PPID C STIME TTY TIME CMD
stu 2328 2312 0 17:34 pts/0 00:00:00 bash
stu 2863 2328 0 18:25 pts/0 00:00:00 ps -f