文件描述符file descriptor通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。当内核打开一个现有文件或创建一个新文件时,它都返回一个文件描述符。在读写文件时,可以私用这个文件描述符。
按管理,每当运行一个新程序时,所有的shell都为其打开了3个标准文件描述符:标准输入,标准输出,标准错误。
不带缓冲的I/O。函数open, read, write, lseek以及close提供了不带缓冲的I/O。这些函数都使用文件描述符。
程序是一个存储在磁盘上某个目录总的可执行文件。内核使用exec函数将程序读入内存,并执行程序。
unix系统确保每个进程都有一个唯一的数字标识符,称为进程ID,进程ID总是一个非负数。
有三个用于进程控制的主要函数:fork, exec, waitpid
调用fork创建一个新进场,新进程是调用进程的一个副本,我们称调用进程为父进程,新创建的进程为子进程。fork对父进程返回新的子进程的进程ID,对子进程则返回0。因为fork创建了一个新进程,所以说它被调用一次,但返回两次。
ctrl + d 文件结束符。
一个进程内的所有线程共享同一地址空间、文件描述符、栈以及进程相关的属性。因为他们能访问同一存储区,所以各线程在访问共享数据时要采取同步措施避免不一致。
于进程相同,线程也用ID标识,但是线程ID只在它所属的进程内起作用,一个进程中的线程ID在另一个进程中没有意义。当在一个进程中对某个特定线程进行处理时,我们可以使用该线程ID引用它。
信号SIGNAL用于通知进程发生了某种情况。一般需要用户自己编写一个函数用来处理信号(如执行了除0操作,则当前进程发送SIGFPE浮点异常信号),这时可以提供一个函数,信号发生时调用该函数,这称为捕捉该信号。
终端键盘上有两种方式产生信号,分别称为中断键CTRL + C,另一个是退出键 CTRL + \ 他们被用于终端当前运行的程序。另一种产生信号的方法是调用kill函数,在一个进程中调用此函数就可以向另一个进程发送一个信号。当然,在向另一个进程发送信号时,我们必须是那个进程的所有者或者超级用户。
unix系统中time_t类型表示日历时间,clock_t用来表示cpu时间。
系统调用和库函数。
进程控制系统调用(fork, exec 和wait)通常由用户应用程序提供了一些库函数,如system, popen。
进程ID虽然是唯一的,但是却是可以复用的。当一个进程终止后,其进程ID就成为了复用的候选者。
ID为0的进程通常是调度进程,通常呗称为交换进程swapper,该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被成为系统进程。进程ID为1的进程通常是init进程,在自举过程结束时由内核调用。init进程绝不会终止,它是一个普通的用户进程(也就是说,它不是内核进程),但是它以超级用户特权运行。init进程将成为所有孤儿进程的父进程。