Chinaunix首页 | 论坛 | 博客
  • 博客访问: 559120
  • 博文数量: 142
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1452
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-12 16:28
文章分类

全部博文(142)

文章存档

2016年(10)

2015年(60)

2014年(72)

我的朋友

分类: C/C++

2014-09-05 17:55:05

函数原型:
       #include
       extern char **environ;

       int execl(const char *path, const char *arg, ...);
       int execlp(const char *file, const char *arg, ...);
       int execle(const char *path, const char *arg,
                  ..., char * const envp[]);
       int execv(const char *path, char *const argv[]);
       int execvp(const char *file, char *const argv[]);
       int execve(const char *path, char *const argv[],
                  char *const envp[]);
一、相同点:
都是exec开头
二、区别:
1. "l"与"v"的区别
    "l"表示参数是列表(list),形式:const char* argv[0] ,const char* argv[1]......(char*)0
    "v"表示参数是数组(vector)形式:char* const argv[]-----直接用数组名称来作为参数值。
2.”path"与“file”的区别
    path:直接指定可执行文件的路径
    file: 如果里面带有"/",则表示是文件路径,如果没有,则按照PATH指定的目录路径进行查找可执行文件
3. execle/execve可以传递一个指向环境变量指针数组的指针,而其它函数只能从environ变量中获取

echoall.c

点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int main(int argc, char *argv[])
  5. {
  6.     int i;
  7.     char **ptr;
  8.     extern char **environ;

  9.     for(i = 0; i < argc; i++)
  10.         printf("argv[%d]: %s\n",i,argv[i]);

  11.     for(ptr = environ; *ptr != 0; ptr++)
  12.         printf("%s\n",*ptr);

  13.     exit(0);
  14. }
编译:gcc -g echoall.c -o echoall



exec.c

点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <signal.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <errno.h>

  6. char *env_init[] = { "USER=wgw", "PATH=/tmp",NULL };

  7. int main(void)
  8. {
  9.     pid_t pid;

  10.     if((pid = fork()) < 0) {
  11.         printf("fork error\n");
  12.     }else if(pid == 0) {
  13.         if(execle("./echoall","echo","myarg1","MY ARG2", (char*)0, env_init) < 0)
  14.             printf("execle error(%d)\n",errno);
  15.     }

  16.     if(waitpid(pid,NULL,0) < 0)
  17.         printf("execle waipid error\n");

  18.     if((pid = fork()) < 0) {
  19.         printf("fork error\n");
  20.     }else if(pid == 0) {
  21.         if(execlp("./echoall","all","only 1 arg", (char*)0) < 0)
  22.             printf("execlp error(%d)\n",errno);
  23.     }
  24.     if(waitpid(pid,NULL,0) < 0)
  25.         printf("execlp waitpid error\n");

  26.     if((pid = fork()) < 0) {
  27.         printf("execl fork error\n");
  28.     }else if(pid == 0) {
  29.         if(execl("./echoall","echoall","MY arg1", "My arg2",(char*)0) < 0)
  30.             printf("execl error(%d)\n",errno);
  31.     }
  32.     exit(0);
  33. }
编译运行:
gwwu@hz-dev2.wgw.com:~/test/process>./a
argv[0]: echo-------------execle
argv[1]: myarg1
argv[2]: MY ARG2
USER=wgw
PATH=/tmp
argv[0]: all-------------------execlp
argv[1]: only 1 arg
HOSTNAME=hz-dev2.aerohive.com
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
.............
HOME=/home/gwwu
LOGNAME=gwwu
QTLIB=/usr/lib64/qt-3.3/lib
CVS_RSH=ssh
SSH_CONNECTION=10.155.60.66 55556 10.155.3.246 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=./a
gwwu@hz-dev2.wgw.com:~/test/process>argv[0]: echoall--------execl    ////-----父进程未等待子进程,直接退出
argv[1]: MY arg1
argv[2]: My arg2
.................
LOGNAME=gwwu
QTLIB=/usr/lib64/qt-3.3/lib
CVS_RSH=ssh
SSH_CONNECTION=10.155.60.66 55556 10.155.3.246 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=./a


阅读(783) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~