关于进程,线程的学习,我是先实践,后理论了,呵呵,有点不搭调,所以比较混乱,现在系统化的补上,而且不得不求助经典<UNIX环境高级编程>
 
1进程标识符
  察看下,进程ID,可以发现,ID为0的进程通常是高度进程swapper;ID为1的通常是init,它通常读与系统有关的初始化文件/etc/inittab文件./etc/init.d中的文件.并将系统引导到一个状态.
一些相关函数:
   pid_t getpid(void)       返回值:调用进程的进程ID
   pid_t getppid(void)     返回值:调用进程的父进程ID
   pid_t getuid(void)        返回值:调用进程的实际用户ID
   pid_t geteuid(void)      返回值:调用进程的有效用户ID
   pid_t getgid(void)        返回值:调用进程的实际组ID
   pid_t getgid(void)        返回值:调用进程的有效组ID
 
2 fork函数
 fork函数被调用一次,但返回两次.对于子进程返回的是0.父进程则是新子进程的ID.
    父子进程仅共享正文段,不共享存储空间部分
 vfork,个人觉得比较好用,可以在调用exec之前保证子进程先运行,并且与父进程共享存储区
 
3 wait和waitpid函数
  调用wait和waitpid的进程可能发生的情况
  1 如果其所有子进程都还在进行,则阻塞
  2 如果一个子进程已终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回
  3 如果它没有任何子进程,则立即出错返回
 
4 exec函数
  fork创建子进程后,子进程往往调用一种exec函数以执行另一个程序,当进程调用exec时,该进
  程完全替换为新程序,而新程序则从其main开始执行。因为exec不创建新进程,所以前后进程的
  ID并不改变。exec只是用一个全新的程序替换了当前进程的正文,数据,堆和栈。
  函数原型:
  #include<unistd.h>
   int execl(const char*pathname,const char*arg0,......);
   int execv(const char*pathname,const char*argv[]);
   其余形式类似