fork(创建一个新的进程):
定义函数 pid_t fork(void);
函数说明 fork()会产生一个新的子进程,其子进程会复制父进程的数据与堆栈空间,并继承父进程的用户代码,组代码,环境变量、已打开的文件代码、工作目录和资源限制等。
返回值 如果fork()成功则在父进程会返回新建立的子进程代码(PID),而在新建立的子进程中则返回0。如果fork 失败则直接返回-1,失败原因存于errno中
execl:
定义函数 int execl(const char * path,const char * arg,…);
函数说明 execl()用来执行参数path字符串所代表的文件路径,接下来的参数代表执行该文件时传递过去的argv(0)、argv[1]……,最后一个参数必须用空指针(NULL)作结束。
返回值 如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。
调用ls命令范例: execl("/bin/ls", “/bin/ls”, “-l” , “/etc”, NULL);
exec系列函数的特点很明显,就是执行成功的时候是不会返回的,一旦返回一定是有错误产生了。但是请注意,执行成功的意思是这条命令本身没错,但是这条命令成不成功exec管不了,他只负责执行,比如说"rm 1.txt",这条指令是正确的,即使没有1.txt这个文件报了无法删除1.txt文件,exec函数还是算执行成功,不会有返回。我们看下例子:
#include <stdio.h>
int main(int argc, char* argv[]){
int a = execl("/bin/rm", "rm", "1.txt", NULL);
printf("%d\n", a);
printf("exiting...\n");
return 0;
}
上面这段代码的执行结果是:
明显没有返回值,我们再看看执行出错的返回值:
#include <stdio.h>
int main(int argc, char* argv[]){
int a = execl("aaa", "bbb", NULL);
printf("%d\n", a);
printf("exiting...\n");
return 0;
}
上面这段代码的执行结果:
很明显,返回值是-1。这个时候execl函数就执行失败了。