进程退出清理 atexit函数 vfork 函数 system 函数 创建子进程先执行, 父进程挂起 创建子进程与父进程共用一个地址空间
进程退出清理
#include <stdlib.h>
/*
* 功能:
* 注册进程正常结束前调用的函数,进程退出执行注册函数
* 参数:
* function:进程结束前,调用函数的入口地址
* 一个进程中可多次调用atexit函数注册清理函数,正常结束前调用函数的顺序和注册时的顺序相反
*/
int atexit(void(*function)(void));
例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void clear_fun1(void);
void clear_fun2(void);
void clear_fun3(void);
int main(int argc, char *argv[]) {
atexit(clear_fun1);
atexit(clear_fun2);
atexit(clear_fun3);
printff("process exit 3 sec later\n");
sleep(3);
return 0;
}
void clear_fun1(void) {
printf("perform clear fun1\n");
}
void clear_fun2(void) {
printf("perform clear fun2\n");
}
void clear_fun3(void) {
printf("perfoorm clear fun3\n");
}
结果:
进程的创建 vfork 函数
/* *功能: * 该进程中创建一个新的进程 *return: * 成功:子进程中返回 0,父进程中返回子进程 ID * 失败:-1 */
pid_t vfork(void);
fork 和 vfork 函数的区别:
vfork 保证子进程先运行, 在它调用 exec 或 exit 之后, 父进程才可能被调度运行
vfork 和 fork 一样都创建一个子进程, 但它并不将父进程的地址空间完全复制到子进程中, 因为子进程会立即,调用 exec(或 exit),所以不访问该地址空间
相反,在子进程中调用 exec 或 exit 之前, 它在父进程的地址空间中运行, 在 exec 之后子进程会有自己的进程空间
验证 vfork 创建子进程先执行, 父进程挂起
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
pid_t pid;
pid = vfork();
if(pid < 0)
{
perror("vfork");
}
if(0 == pid)
{
int i = 0;
for(i = 0; i < 5; i++)
{
printf("this is son process\n");
sleep(1);
}
_exit(0);
}
else
{
while(1)
{
printf("this is father process\n");
sleep(1);
}
}
return 0;
}
打印:
验证 vfork 创建子进程与父进程共用一个地址空间
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int var = 10;
int main(int argc, char *argv[]) {
pid_t pid;
int num = 9;
pid = vfork();
if(pid < 0)
{
perror("vfork");
}
if(0 == pid)
{
var++;
num++;
printf("in son process var = %d, num = %d\n",var, num);
_exit(0);
}
else
{
printf("in father process var = %d, num = %d\n",var, num);
}
return 0;
}
打印:
system 函数
#include <stdlib.h>
/* * 功能: * system 会调用 fork 函数产生子进程 * 子进程调用 exec 启动/bin/sh -c string 来执行参数 string 字符串所代表的命令 * 此命令执行完后返回原调用进程 * 参数: * 要执行的命令的字符串 * return: * 成功:command 为 NULL,则 system()函数返回非 0 * 失败:system()在调用/bin/sh 时失败,返回 127,其它原因返回-1 * 注意: * system 调用成功后会返回执行 shell 命令后的返回值 * 其返回值可能为 1、 127 也可能为-1,故最好应再检查 errno 来确认执行成功 */
int system(const char *command);
例子:
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(int argc, char *argv[]) {
int status;
status = system("ls -alh");
if(WIFEXITED(status))
{
printf("the exit status is %d\n",status);
}
else
{
printf("abnornamal exit\n");
}
return 0;
}
打印: