您的位置:首页 > 其它

使用execvp()函数需要注意的两点

2011-09-28 00:42 531 查看
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] = '\0';
cp = malloc(strlen(buf) + 1);

if(cp == NULL)
{
fprintf(stderr, "no memory\n");
exit(1);
}
strcpy(cp, buf);
return cp;
}


更详细的介绍:

http://www.mkssoftware.com/docs/man3/execl.3.asp


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: