fcntl.h
int open(const char * pathname , int flags);
int open(const char * pathname, int flags, mode_t mode);
unistd.h
pid_t fork(void);
如果 fork()调用成功,就会使内核建立一个新的进程,所建的新进程是调用 fork()的进程的副本。新建立的进程被成为子进程(child process),那个调用 fork()建立此新进程的进程被称为父进程(parent process)。以后,父进程与子进程就并发执行,它们都从fork()调用后的那句语句开始执行。父进程中返回子进程pid,子进程中返回0,出错返回-1
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[]);
exec 系列中的系统调用都完成相同的功能,它们把一个新程序装入调用进程的内存空间,来改变调用进程的执行代码,从而形成新进程。如果 exec 调用成功,调用进程将被覆盖,然后从新程序的入口开始执行。这样就产生了一个新的进程,但是它的进程标识符与调用进程相同。如果 execl返回,说明调用失败
execl(“/bin/ls”,”ls”,”-l”,NULL); //ls -l 第一个参数描述命令path
char* av[]={"ls","-l",NULL};
execv("/bin/ls",av); //ls -l
execl(“ls”,”ls”,”-l”,NULL);
char* argin[]={"ls", "-l", NULL};
execvp(argin[0],argin); // ls -l;
//execlp 和 execvp 的区别是不用完整path,会在系统path环境变量中搜索
void _exit(int status);
接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构
sys/wait.h
int wait(int *status);
父进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。返回子进程pid和子进程返回值status
stdlib.h
void exit(int status);
比 _exit() 多做一些事情,清理I/O缓冲