进程参数和环境变量的意义
一般情况下,子进程的创建是为了解决某个问题。那么解决问题什么问题呢?这个就需要进程参数和环境变量来进行决定的。
子进程解决问题需要父进程的“数据输入”(进程参数 & 环境变量)
设计原则:3.1 子进程启动的时候,必然用到的参数使用进程参数传递 3.2子进程解决问题可能用到的参数使用环境变量传递
父进程 ====>(进程参数/环境变量) ===> 子进程
子进程是如何将结果返回给父进程?
我们知道父进程创建子进程是为了解决问题的,那么这个解决问题的结果需要返回给父进程吗?当然需要!先看看一下一个简单的demo
#include <stdio.h>
int main(int argc,char* argv[])
{
printf("Test:: Hello World\n");
return 19;
}
父进程自己解决问题不就行了吗?为什么还要创建子进程来解决问题呢?
深入理解父子进程
子进程的创建是为了并行的解决子问题(问题分解)
父进程需要通过子进程的结果最终解决问题(并获取问题)
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *wstatus);
1.等待一个子进程完成,并返回子进程标识和状态信息
2.当有多个子进程完成,随机挑选一个子进程返回
pid_t waitpid(pid_t pid, int *wstatus, int options);
1.可等待特定的子进程或者一组子进程
2.在子进程还未终止时,可以通过options设置不必等待(直接返回)
#include <unistd.h>
void _exit(int status); //系统调用,终止当前进程
#include <stdlib.h>
void exit(int status);//库函数,先做资源清理,再通过系统调用(_exit)终止进程
void abort(void); //异常终止当前进程(通过产生SIGABRT信号终止)
//信号可以理解为:操作系统发送给进程的通知。
接下来来看一下dmeo。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc,char* argv[])
{
pid_t pid=0;
int a=1;
int b=0;
int status=0;
printf("parent = %d\n",getpid());
if((pid = fork()) == 0) exit(-1);
printf("child = %d\n",getpid());
if((pid = fork()) == 0) abort();
printf("child = %d\n",getpid());
if((pid = fork()) == 0) a=a/b,exit(1);
printf("child = %d\n",getpid());
sleep(3);
while((pid = wait(&status)) > 0)
{
printf("child:%d,status=%x\n",pid,status);
}
return 19;
}