使用execvp()函数需要谨慎的两点
发布时间:2021-12-18 18:38:30 所属栏目:PHP教程 来源:互联网
导读:exec系统调用会从当前进程中把当前程序的机器指令清除,然后在空的进程中载入调用时指定的程序代码,最后运行这个新的程序。 #includestdio.h #includesignal.h #includestring.h #includeunistd.h #define MAXARGS (20) #define ARGLEN (100) int main() {
|
exec系统调用会从当前进程中把当前程序的机器指令清除,然后在空的进程中载入调用时指定的程序代码,最后运行这个新的程序。 #include<stdio.h> #include<signal.h> #include<string.h> #include<unistd.h> #define MAXARGS (20) #define ARGLEN (100) int main() { char *arglist[MAXARGS + 1]; int numargs; char argbuf[ARGLEN]; char *makestring(); numargs = 0; while(numargs < MAXARGS) { printf("Arg[%d]?", numargs); if(fgets(argbuf, ARGLEN, stdin) && *argbuf != 'n') arglist[numargs ++] = makestring(argbuf); else { if(numargs > 0) { arglist[numargs] = NULL; execute(arglist); numargs = 0; } } } return 0; } int execute(char* arglist[]) { /* *#include<unistd.h> *int execlp(const char* file, const char* argv ...) * eg. execlp("ps","ps","-au","-x",(char*)0); * 1.最后一个参数必须是(char*)0, 如果不强制转换成char*,就会自动转换成int* 有未知的错误。 * 2.第一个参数是要运行的文件,会在环境变量PATH中查找file. * 3.失败会返回-1, 成功无返回值,但是,会在当前进程运行,执行成功后,直接结束当前进程。可以在子进程中运行。 * 4.第二个参数,是一个参数列表,如同在shell中调用程序一样,参数列表为0,1,2,3……因此,ps作为第0个参数,需要重复一遍 * int execvp(const char* file, const char* argv[]); argv列表最后一个必须是 NULL */ execvp(arglist[0], arglist); perror("execvp failed"); exit(1); } char* makestring(char *buf) { char *cp, *malloc(); buf[strlen(buf) - 1] = ' |
