今天在写应用层程序的时候,按照IPNC的指导手册,要想调用某个函数,首先要初始化这个模块。原话如下:
Before we start to use the GetAVData, we have to initial the message driver and setup the memory for tranferring the encoded data。
void Init_Interface(int Msg_id)
{
int qid;
if(ApproDrvInit(Msg_id))
exit(1);
if(func_get_mem(&qid))
{
ApproDrvExit();
exit(1);
}
}
要求在Process中调用这个初始化函数,并且在一个Process中只能调用一次,受到去年看的《Linux内核设计与实现》这本书的影响,书中有这么一句话“对Linux而言,线程只不过是一种特殊的进程罢了”。就想当然的以为线程和进程是一样的了,其实两者还是有差别的。以本代码为例,在ApproDrvInit()这个函数中,会以Msg_id对全局变量gProcId进行赋值,但是线程之间是共享数据区的,如果想当然的在需要用到这个的时候就调用一次,那么全局变量就面目全非了。
用户进程拥有 进程描述符、PID、进程正文段、核心堆栈 、用户空间的数据段和堆栈
用户线程拥有进程描述符、PID、进程正文段、核心堆栈,同父进程共享用户空间的数据段和堆栈
用户线程也可以通过exec函数族拥有自己的用户空间的数据段和堆栈,成为用户进程。
由于线程之间是共享存储区的,所以IPC通信在这里就显得有点多余了,一般只需要用全局变量就行了,程序里面还用到共享存储,不知道是怎么想的。
IPNC整个控制层都是以进程的IPC通信来写的,不知道是不是损失了线程的优势呢?不过结构上倒是没有错的,理解上终于又更深了一步。