linux下的进程间和线程间通信
进程间的通信
这个有5种啊,他们是1.管道通信,2.信号signal通信,3.消息队列,4.共享内存,5.信号量
管道
标准流管道
FILE类型
popen(要运行的linux指令,“r”或“w”)
会运行里面的linux指令
pclose(管道文件的指针);
关闭管道文件。
非标准流管道
文件类型为p都是管道文件
类似管道,一端出水,一端进水,管道文件有两个端,一个读端,类似出水,写端类似进水。
所以有两个文件描述符,他们储存在一个有两个整形元素的数组里
如fds【2】,调用pipe(fds),就会创建管道了。
fds【0】是读端
fds【1】是写端
无名管道
只能在父子或兄弟进程才能使用
使用pipe(fds)创建了管道文件,就可以read(fds[0],buf,sizeof(buf)),类似这样读写内容了。进行进程间的通信了。
注意下这个
命名管道,也就是FIFO
非父子兄弟进程也可以使用,
mkfifo(命名管道文件的路径名,文件访问的权限)
创建一个命名管道文件
unlink(命名管道文件的路径名)
删除一个命名管道文件
这个是命名管道的读写规则
命名管道文件的打开关闭,也是open,和close
读写函数也是read,和write。
内存映射
就是把内容映射到某一个内存中,然后直接对其进行读写,加快速度。
mmap(内容要映射到的内存地址,文件的多少要映射,port对映射区域的保护方式,flag影响映射区域的特性,要映射的文件,文件从开头之后的哪里进行映射)
建立映射,其中
port
flags
msync(mmap的返回指针,多大,flag与上面一样)
对内存区域的修改同步到文件。
munmap(mmap的返回指针,多大)
取消映射。
注意:要保证映射到内存的文件不能为空
共享内存
呃,这个与映射差不多,但是不一样,这个主要是 多进程的通信。
就是开辟一个内存空间,放入要共享的数据,要访问的数据的进程,会映射到这个空间。
ftok(可访问文件的路径名,一个字符)
两者组合成一个ftok的返回值key,我们要用key来访问共享内存。
shmget(key,共享内存的大小,shmflg)
这个用来创建或打开共享内存,打开成功返回一个唯一的标识号。
shmat(shmget返回的唯一标识号,共享内存的地址,位标识)
映射到地址,第二个参数可为NULL,使系统自己分配吗,第三个参数为0即可。映射成功后,该函数返回共享内存的首地址。
shmdt(shmat的返回值)
用来分离共享内存和进程
shmctl(shmget返回的唯一标识符,cmd操作方式,buf’共享内存的信息结构体数据)
第二个和第三个参数参数
消息队列
msgget(ftok函数创建的key,msgflg)
创建消息队列。
msgsnd(msgget的返回值,消息结构体,消息体的大小,msflg)
发送消息
msgrcv(msgget的返回值,消息结构体,消息体的大小,msgtyp,msflg
接受消息
这个是结构体
我们往里面输入和输出信息。
msgctl(msget返回的消息队列标识符,IPC_RMID,NULL)
删除消息队列,msgctl是消息队列控制函数。
信号量
了解一下即可,我们进程用的是system V信号量,信号量为0表示不能使用,为1表示可以使用
semget(ftok的返回值key,要使用的信号量数目,flag)
创建一个信号集或者访问一个信号集,成功就返回一个信号集标识符,这个flag如下
semop(semget返回的标识符,指向结构体数组的指针,结构数值打大小 )
这个函数用来改变信号量的状态。
semctl(semid返回的值,要操作的信号量的编号,cmd操作, 一个union类型的变量)
控制信号量的信息,下面是其的一些参数
简单了解一下。
线程的通信
条件变量
使用条件变量时,线程一定要上了互斥锁
条件变量创建的有静态和动态,我们了解动态即可
我们使用时要先定义条件变量的结构
这样的:pthread_cond_t 变量名
pthread_cond_init(条件变量的结构,NULL)
创建了一个条件变量。
pthread_cond_destroy(条件变量的结构);
注销一个条件变量。
pthread_cond_wait(条件变量的结构,对应的互斥锁结构)
无条件等待函数,直到激活
pthread_cond_timedwait(条件变量的结构,对应的互斥锁结构,时间)
一直等待函数,时间到了就会解除。
cond就是条件变量结构。
信号灯
信号灯值大于0,说明可以使用,小于等于0时,说明不可以使用
用来说资源可不可用
先定义一个信号灯标识符
sem_t 变量名
sem_init(信号灯标识符,pshared,value)
这个创建信号灯的函数
sem_destroy(信号灯的标识符)
这个用来注销信号灯
sem_post(信号灯的标识符)
点灯操作,也就是加一变成了可以使用。
sem_wait(信号灯的标识符)
灭灯操作,也就是减一变成了不可以使用。
sem_getvalue(信号灯的标识符,信息存放的地址指针)
获取信号灯的值。