关于进程,线程的学习,我是先实践,后理论了,呵呵,有点不搭调,所以比较混乱,现在系统化的补上,而且不得不求助经典<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[]);
其余形式类似