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
通常,一个进程只有一个控制线程。同一时刻只执行一组机器指令。对于某些问题,如果不同部分,个使用一个控制线程。那么整个问题解决起来就容易多了。
在一个进程内所有线程,共享一个地址空间,文件描述符,栈以及进程相关的属,因为,他们能访问同意存储区,所以个线程在访问共享数据的同时,需要采取同步措施,避免数据不一致性。