1.6、程序和进程
- 程序:存放在磁盘上,处于某个目录中的可执行文件。使用6个exec函数中的一个由内核将程序读入存储器,并使之执行。
- 进程和进程id:程序的执行被称为进程(process)。unix确保每个进程都有一个唯一的数字标识符。称为进程ID。进程id总是非负数。
看如下例子:pro_1-4.c
#include "apue.h" int main(void) { printf("hello world from process ID %d\n",getpid); exit(0); }
编译:gcc -o pro_1-4 pro_1-4.c
运行:./pro_1-4
结果:
3.进程控制:有三个用于进程控制的主要函数:fork,exec,和waitpid。(exec有六种变体);
示例:程序pro_1-5.c
#include "apue.h" #include <sys/wait.h> int main(void) { char buf[MAXLINE]; pid_t pid; int status; printf("%%");//print prompt while(fgets(buf,MAXLINE,stdin)!=NULL){ if(buf[strlen(buf)-1]=='\n') buf[strlen(buf)-1]=0; if((pid=fork())<0) { err_sys("fork error"); }else if(pid=0){ execlp(buf,buf,(char*)0); err_ret("couldn't execute:%",buf); exit(127); } if((pid=waitpid(pid,&status,0))<0) err_sys("waitpid error"); printf("%%"); } exit(0); }运行结果:
程序解释:
- 函数fgets从标准一行行的读,一终止符结束,fgets返回一个null指针,循环终止,进程终止。
- fgets是以换行符终止,后随一个null字节,所以用strlen计算长度。二execlp要求一null换行。
- fork创建一个新进程。新进程是调用进程的复制品,调用进程是父进程。新创建的为子进程。fork像父进程返回进程ID,子进程则返回0,以内fork创建一新进程。所以说,他被调用一次,但返回两次。
4.线程和线程ID
通常,一个进程只有一个控制线程。同一时刻只执行一组机器指令。对于某些问题,如果不同部分,个使用一个控制线程。那么整个问题解决起来就容易多了。
在一个进程内所有线程,共享一个地址空间,文件描述符,栈以及进程相关的属,因为,他们能访问同意存储区,所以个线程在访问共享数据的同时,需要采取同步措施,避免数据不一致性。