1.system函数:创建一个新进程,即在一个程序的内部启动另一个程序,Linux中通过库函数system完成
基本语法
#include<stdlib.h>
int system(const char *string)
system函数的作用是:运行以字符串参数的形式参数传递给他的命令并等待命令完成;命令的执行情况就如同在shell中执行如下命令: sh -c stirng;如果shell无法执行该命令,则返回127,如果是其他错误,则返回-1,执行成功就返回该命令执行完成的代码。
system函数的缺点:阻塞式的(父进程必须等待子进程完成后才能继续);如果采用&使进程后台运行的话,又不会有好的用户体验;system函数是通过shel来启动进程,所以依赖的shell程序及路径。
2.exec系列函数:exec系列函数由一组相关的函数组成,用于把当前进程替换为新进程,新进程由path或file参数指定。
基本语法
#include<unistd.h>
char **environ;
int execl(const char *path,const * arg0, ... , (char *)0)
int execlp(const char *file,const * arg0, ... , (char *)0)
int execle(const char *file,const * arg0, ... , (char *)0)
说明:这3个函数带有可变参数列表,该列表的参数用于传递给新进程的main函数;execl指从绝对路径启动程序,execlp函数是指从环境变量搜索可执行程序;execle函数是指从环境变量所指定的路径启动程序;该系列函数执行发生错误时返回-1。
3.fork函数
fork函数也可以启动一个新进程,其方法是复制当前进程。
fork函数在进程表中创建一个新的表项,新表项的许多属性与当前进程是相同的,执行的代码也完全相同,但新表项有自己的数据空间,环境和文件描述符。
基本语法:
#include<sys/types.h>
#include<unistd.h>
pid_t fork(void)
说明:父进程的fork调用返回的是新的子进程的pid,新子进程继续执行,就像塬进程一样;不同之处在于,子进程的fork调用返回的是0,父子进程就是通过这一点来区分彼此的;fork调用失败返回-1,
fork函数使用进阶:
当用fork启动一个子进程时,子进程就有了其自身的生命周期并将独立运行。
如果想知道子进程何时运行结束,可以通过wait函数,让父进程等待子进程结束后再结束。
4.wait函数
pid_t wait(int *stat_loc)
说明:wait函数返回已结束的子进程的PID;stat_loc参数用来保存一个状态信息,该信息将被父进程用于来了解子进程的状态,该值就是进程中exit函数的状态码;可以直接使用该参数进行判断,还可以使用sys/wait.h中的宏来了解状态信息。