Chinaunix
标题:
请大家看个Unix /linux 编程实践上的例子
[打印本页]
作者:
hmchzb19
时间:
2016-01-18 15:12
标题:
请大家看个Unix /linux 编程实践上的例子
代码如下:
#include <apue.h>
#define MAXARGS 20
#define ARGLEN 100
int main()
{
char *arglist[MAXARGS+1]; //an array of ptrs*
int numargs; //index into arrays
char argbuf[ARGLEN]; //read stuff here
char *makestring(); //malloc etc
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[])
{
execvp(arglist[0],arglist);
perror("execvp failed");
exit(1);
}
char *makestring(char *buf)
{
char *cp;
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;
}
复制代码
说白了就是用exec* 在当前bash 下覆盖,exit退出,应该退出当前bash进程。
但是实际执行的时候不是如此:
[root@ system_program]# ./psh1
Arg[0]?pwd
Arg[1]?
/usr/local/src/c/system_program
[root@ system_program]#
复制代码
这是为什么?
是bash 现在的运行机制吗?
作者:
hanzhenlll
时间:
2016-01-18 15:18
没看出有什么结果不对....
作者:
yjh777
时间:
2016-01-18 15:31
exec 覆盖的是调用它的进程 ./psh1 , 不是什么当前 bash;
bash 内建命令 exec 才能覆盖自己。你直接 ./psh1 是先 fork() 一个child process,child process 里面再 exec
作者:
hmchzb19
时间:
2016-01-18 15:43
LS 说的是啊,我后来才想到 bash 是先fork出psh1 ,然后exec 的。
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2