linux fork exec程序

#include<wait.h>
#include<stdio.h>
#include<sys/types.h>
int main()
{
    pid_t pid = fork();
    int stat = 0;
    printf("##pid:%d\n",pid);
    switch(pid)
    {
        case -1:
            perror("fork failed");
            exit(1);
            break;
        case 0:
            printf("\n");
            execlp("ps","ps","au",NULL);
            break;
        default:
            do
            {
                pid = waitpid(-1,&stat,WNOHANG);
                if(pid==0)
                {
                    printf("parent do something else.\n");
                    sleep(1);
                }
            }while(pid==0);
            printf("Child has finished:PID=%d\n",pid);
            printf("parent,ps done\n");
            break;
    }
    exit(0);
}

执行的结果如下:
在这里插入图片描述

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[]);

path参数表示你要启动程序的名称包括路径名
arg参数表示启动程序所带的参数,一般第一个参数为要执行命令名,不是带路径且arg必须以NULL结束
带l 的exec函数:execl, execlp, execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束。
带 p 的exec函数:execlp,execvp,表示第一个参数path不用输入完整路径,只有给出命令名即可,它会在环境变量PATH当中查找命令

不带 l 的exec函数:execv,execvp表示命令所需的参数以char *arg[]形式给出且arg最后一个元素必须
是NULL

带 e 的exec函数:execle表示,将环境变量传递给需要替换的进程

execlp("ps","ps", "au", 0);
注释:
 execlp : 
 带l 的exec函数:execl, execlp, execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束。
 表示第一个参数path不用输入完整路径,只有给出命令名即可, 它会在环境变量PATH当中查找命令(execlp中的p代码 PATH)
arg参数表示启动程序所带的参数,一般第一个参数为要执行命令名,不是带路径且arg必须以NULL结束, execlp有四个参数,其中第二个,第三个为有效参数,最后一个0以NULL结尾
execl("/bin/ls","ls","-l",NULL);
注释:
带l 的exec函数:execl, execlp, execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束.
path参数表示你要启动程序的名称包括路径名.
由于不带P,所有需要指定全路径:  /bin/ls
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    printf("entering main process---\n");
    int ret;
    char *argv[] = {"ls","-l",NULL};
    ret = execvp("ls",argv);
    if(ret == -1)
        perror("execl error");
    printf("exiting main process ----\n");
    return 0;
}
execvp:
注释: 
不带 l 的exec函数:execv,execvp表示命令所需的参数以char *arg[]形式给出且arg最后一个元素必须
是NULL
p: 不用带路径,直接在path环境变量找
execle
带 e 的exec函数:execle表示,将环境变量传递给需要替换的进程
execle.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    char * const envp[] = {"AA=/use/bin", "BB=/opt/test", NULL};
    printf("Entering main ...\n");
    int ret;
    //ret =execl("./hello", "hello", NULL);
    ret =execle("./hello", "hello", NULL, envp);
    if(ret == -1)
        perror("execl error");
    printf("Exiting main ...\n");
    return 0;
}

hello.c
#include <unistd.h>
#include <stdio.h>
extern char** environ;

int main(void)
{
    printf("hello pid=%d\n", getpid());
    int i;
    for (i=0; environ[i]!=NULL; ++i)
    {
        printf("%s\n", environ[i]);
    }
    return 0;
}


执行结果:
在这里插入图片描述

发布了77 篇原创文章 · 获赞 6 · 访问量 9331

猜你喜欢

转载自blog.csdn.net/ding283595861/article/details/104498106