1. 概述:

该demo主要完成了linux下进程创建, 资源回收, 以及exec函数使用等操作,相关接口介绍可以参考<<UNIX环境高级编程>>

linux centos执行exe文件_父进程

2. 测试:

linux centos执行exe文件_linux_02

/*
process_tip.h
*/

/*
exec函数 : 
    根据指定的文件名或目录名查询可执行文件, 找到后会使用它去取代原调用进程的数据段、代码段、堆栈段
    在执行完毕后, 原调用进程的内容除进程号pid外全部被新的进程所替换
    这里的可执行文件可以是二进制文件, 也可以是Linux系统下任何可执行的脚本程序
    函数执行成功不会返回, 若执行失败则返回-1, 失败原因会记录在error

    带l的exec函数 : execl, execlp, execle, 表示后边的参数以可变参数的形式给出且都以一个空指针结束
    带v的exec函数 : execv, execvp, execve, 表示后边的参数以char *arg[]形式给出且最后一个元素是空指针
    带p的exec函数 : execlp, execvp, 表示第一个参数path不用输入完整路径, 只有给出命令名即可, 它会在环境变量PATH当中查找命令
    带e的exec函数 : execle, execve, 将环境变量传递给需要替换的进程
*/
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[]);

/*
其实现中调用fork,exec,waitpid等相关函数, 因此有3种返回值
*/
int system(const char *command);
/*
demo_process.c
进程编程demo : 进程创建, 资源回收, 以及exec函数使用等

父子进程 : 
    共享 : 代码段
    继承 : 数据空间, 堆栈区

进程ID : 
    0 : 通常是调度进程, 常常被称为交换进程(swapper)
        该进程是内核的一部分它并不执行任何磁盘上的程序, 因此也被称为系统进程
    1 : 通常是init进程, 在自举过程结束时由内核调用
        该进程的程序文件, 在UNIX早起版本中是/etc/init, 在较新的版本中是/sbin/init

僵尸进程 : 
    子进程比父进程先结束, 而父进程又没有回收子进程, 释放子进程占用的资源, 此时子进程将成为僵尸进程

孤儿进程 : 
    父进程退出, 而它的子进程还在运行, 那么子进程将成为孤儿进程
    孤儿进程将被init进程(进程号为1)所收养, 并由init进程对它们完成状态收集工作
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/prctl.h>

int main(int argc, char **argv){

    pid_t pid;

    pid = fork();
    if(pid < 0){
        /*printf("fork:%s\n", strerror(errno));*/
        perror("fork:");
        return -1;
    }else if(pid == 0){
        /*
        子进程
        */
        prctl(PR_SET_NAME, "child_process");

        printf("child process\n");
        printf("child process\t parant pid\t = %d\n", getppid());
        printf("child process\t myself pid\t = %d\n", getpid());
        if(execl("/bin/ls", "ls", "-l", NULL) < 0){
            perror("execl:");
            return -1;
        }
    }else{
        /*
        父进程
        pid返回值为子进程的ID
        */

        /*
        进程重命名
        */
        prctl(PR_SET_NAME, "parant_process");

        printf("parant process\n");
        printf("parant process\t parant pid\t = %d\n", getppid());
        printf("parant process\t myself pid\t = %d\n", getpid());
        /*pid_t waitpid(pid_t pid,int *status,int options);*/
        /*pid_t wait(int *status);*/
        wait(NULL);
    }

    /*exit(0);*/
    return 0;
}
#Makefile
CC := gcc
INCLUDE = -I /home/demo/include/

all:
	$(CC) demo_process.c $(INCLUDE) -o demo_process -Wall -Werror

clean:
	rm demo_process