fork创建进程之后,子进程和父进程执行相同的代码,但是在实际开发当中,我们希望父子进程执行不同的代码。
execl函数族:
第一组:
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
path路径名字,file文件名字在Path中查找,arg参数列表。
使用注意:
第二个参数部分,以(char *)0或者NULL结尾,代表这个字符串参数结束。
例如:
printf("execl:\n");
7 if(execl("/bin/ls", "l",NULL) < 0){
8 perror("execl");
9 }
11 printf("execlp\n");
12 if(execlp("ls", "ls",NULL) < 0){
13 perror("execl");
14 }
第二组:
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
argv是参数列表,指针数组形式。
char *arg[] = {"ls","-a","-l", "./",NULL};
7 printf("execv:\n");
8 if(execv("/bin/ls", arg) < 0){
9 perror("execv");
10 }
12 printf("execvp\n");
13 if(execvp("ls", arg) < 0){
14 perror("execvp");
15 }
注意:
当前执行的内容虽然被替换掉了,但是进程号是不变化的。
如果不被替换,开启一个子进程。
开启另一个进程的第二种方式:使用system函数
int system(const char *command);
if(system("./execl")<0){
perror("system");
}
与execl函数族不同的是,等待command执行完后,还会回来继续执行当前进程,而不是不再回来。