1. 概述:
该demo主要完成了linux下进程创建, 资源回收, 以及exec函数使用等操作,相关接口介绍可以参考<<UNIX环境高级编程>>
2. 测试:
/*
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