Chinaunix首页 | 论坛 | 博客
  • 博客访问: 333712
  • 博文数量: 124
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 321
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-04 16:09
文章分类

全部博文(124)

文章存档

2014年(124)

分类: 嵌入式

2014-08-14 13:34:13

exec提供了一种在进程中启动另外一个程序的执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。

1.可执行文件查找方式
exec族中的函数以p结尾的函数可以只给出文件名,系统会自动从环境变量“$PATH”所包含的路径中进行查找。
即 结尾不是p的,必须要给出文件的路径,并且最后的参数为NULL;

2.参数表传递方式
两种方式:逐个列举或是将所有参数通过指针数组传递。
以函数名的第五位字母来区分,字母为“l”(list)的表示逐个列举的方式;
字母“v”(vertor)的表示将所有参数构造成指针数组传递;

3.环境变量的使用
exec函数族可以默认使用系统的环境变量,也可以传入指定的环境变量。这里,以“e”(Environment)结尾的两个函数可以 envp[]中传递当前进程所使用的环境变量。

exec(1,2,3....,最后个参数)
exec族中,第一个参数为要执行程序的路径。
          第二个参数为要执行的程序名称。
     第三个参数为给要执行程序传递参数。
     最后一个参数为NULL;

例子:
int main ()
{
if(-1 == execle("./exec2","exec2","1.txt",NULL))
{
perror("");
exit(0);
}
}//打开exec2可执行文件,并将"1.txt"传递给exec2中的main函数中的参数中

 exit()调用退出处理函数,清理缓存区,调用exit系统调用,进程结束。
_exit()不清理缓存区。

 

利用exec实现shell的模仿 :

#include
#include
#include
#include
#include
#include
#include

#define N 64

int main()
{
    pid_t pid;
    char buf[N];
    char *arg[N];
    int i = 0;

    printf(">");
    while (fgets(buf, N, stdin) != NULL)
    {
        buf[strlen(buf)-1] = 0;
        if ((pid = fork()) == -1)
        {
            perror("fork");
            exit(-1);
        }
        if (pid == 0)
        {
            arg[i++] = strtok(buf, " ");
            do
            {
                arg[i++] = strtok(NULL, " ");
            }while(arg[i-1] != NULL);

            if (execvp(arg[0], arg) != -1)
            {
                perror("execvp");
                exit(0);
            }
        }
        else
        {
            wait(NULL);
            printf(">");
        }
    }

    exit(0);
}

阅读(1588) | 评论(0) | 转发(0) |
0

上一篇:进程(1)

下一篇:wait函数和waitpid函数

给主人留下些什么吧!~~