这节课……讲的有点多,总结起来可能会有点杂。一、补进程管理的尾巴。二、继而介绍了进程同步。三、提到了部分进程间的管道通信。我一个一个来复习总结。
进程管理收尾
当父进程通过fork()创建了一个子进程,由于子进程是讲父进程的程序完完全全的复制过来的,当我们需要在子进程中执行一些指令那么父进程必须先设置,所以为了解决这个问题引入一个函数exec家族的函数。简单的回顾一下吧,一天满课晚上还要补博客,害!!
exec族
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[]);
int execve(const char *path, char * const argv[], char * const envp[]);
exec家族有六个函数,作用也都大同小异,其最终目的都是为了执行命令。在这之中又细分两类,
- execl类:函数将以列举的形式传入参数,由于参数列表的长度不定,所以要用哨兵NULL表示列举结束;
- execv类:函数将以参数向量表传递参数,char * argv[]的形式传递文件执行时使用的参数,数组中最后一个参数为NULL;
提醒一下,有些参数是path有些参数又是file两个有一点细微的区别。当参数是path时,传入的为命令的路径名;当参数是file,传入的可执行文件名。
至于函数几个函数到底该怎么使用,看看后面的案例就会明白怎么使用、有什么作用了。
案例四
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
pid_t tempPid;
tempPid=fork();
if(tempPid == -1){
perror("fork error");
exit(1);
} else if(tempPid > 0) {
printf("parent process:pid=%d\n", getpid());
} else {
printf("child process:pid=%d\n", getpid());
//execl("/bin/ls","-a","-l","./",NULL); //①
//execlp("ls","-a","-l","./",NULL); //②
char *arg[]={"-a","-l","./", NULL}; //③
execvp("ls", arg);
perror("error exec\n");
printf("child process:pid=%d\n", getpid());
} //of if
return 0;
} //of main
以上即为大概格式,可以用ls命令查看文件夹中的文件、以路径查看文件等等。除了ls还可以用其它的命令,只要时bash能执行的在exec家族中也能。
exit函数
其实exit这个玩意儿,只要学过编程的应该都了解一些,
void exit(int status);
参数status即状态,为0时正常退出,其它值为异常退出,但其实exit是一个集成的函数,也就是被封装过的,在exit封装内部有一个核心函数&#