3.11 进程篇-总结

通信方式:

1:无名管道

特点:
1)半双工
2)端口无名
3)只能用于有亲缘关系的进程
函数:
int pipe(int pipefd[2]);
创建超过后会自动创建俩个文件描述符fd[0]和fd[1],fd[0]用来读,fd[1]用来写
注意:
1)已经明确指定为读端,则应该利用close函数关闭写段;相反亦然
2)想管道中写入数据,管道会有一定的数据缓存区,如果没有读走,则会造成写段阻塞
3)一般有写端,必定存在读端,需要源源不断将数据取出

2:有名管道

特点:
1)全双工
2)端口有名
3)可使互不相干的进程通信
函数:
int mkfifo(const char *pathname, mode_t mode)
pathname:创建的文件名
mode:创建的权限 O_RDONLY 读管道 O_WRONLY 写管道

3:信号

函数:
1)sighandlet_t signal(int signum,sighandler_t handler);
signum:进程号
handler:
SIG_IGN 忽略该信号
SIG_DFL:采用系统默认方式调用
还可以用作函数指针
2)int kill(pid_t pid, int ssig)
pid:正数就是接受信号的进程号
sig:发送过去的信号
3)int raise(int sig)
向自己的进程发送信号
4)alarm(ynsigned int secondes)
定时器,以S为单位
5)int pause(void)
将调用进程挂起

4:共享内存

整个流程如下
1)获取key
key_t ftok(const char *pathname,int proj_id)
pathname:文件名或路劲
proj_id:可随意定一个值
2)创建或打开共享内存
int shmget(key_t key,size_t size,int shmflg)
key:ftok获取的出来的
size:分配的共享内存大小
shmflg:创建的权限
3)映射共享内存
void *shmat(int shmid, const void *shmaddr,int shmflg)
shmid:shmget获取出来的
shmaddr:将共享内存映射到指定地址,一般为NULL,由系统默认分配
shmflh:默认为0,可供读写;SHHM_RDONLY 共享内存仅读
出个返回映射地址,失败返回0
4)撤销共享内存映射
int shmdt(const void *shmaddr)
shmaddr:共享内存映射到的地址
5)删除共享映射
int shmctrl(int shmid,int cmd,strcut shmid_ds *buf)
shmid:要操作的内存共享标识符
cmd:
buf:一般设置为NULL

5:信号量

1)获取key
key_t ftok(const char *pathname, int proj_id);
2)创建信号灯
int semget(key_t key, int nsems, int semflg)
key:ftok获取出来
nsems:信号灯包含的灯数,一般为1
semflg:权限 常规为IPC_CREAT|0666
3)PV操作
semop(int semid, struct sembuf *sop,unisgned nsops)
semid 信号灯集标识符号
/sembuf 查看man手册 PV操作就是通过这个结构体实现
struct sembuf{
short sem_num; //操作信号灯的编号
short sem_op; //可以有三这个值
//0 等待 直到信号灯的值变为0
//1 释放资源 即开始执行程序 V操作
//-1 分配资源 P操作
short sem_flag;// 0 默认 一般采用这样方式
//IPC_NOWAIT
//SEM_UNDO

nsops 操作的信号灯的个数 一般也是1
4)获取属性
int semctrl(int semid, int semnum, int cmd…)
变参函数 建议查看man手册
semid 信号灯集ID
semnum 修改的信号灯编号
cmd : GETVAL 获取对象的属性
SETVAL 设置信号灯值
IPC_RMID 从系统中删除信号灯集合
buf 指定IPC_SET/IPC_STAT时用以保存或者设置对象

线程

创建:

int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(start_routine)(void),void *arg)
第一个thread为创建的线程地址,可以自定义一个int tid,取地址去创建即可
第二个指定线程的属性 NULL为缺省属性,暂时现在都有这个。缺省属于结合属性。还有一种为分离属性
结合属性:表示为主线程收子线程的尸,释放子线程的资源
分离属性:即无须主线程收子线程的尸,自己调用完毕,自己释放
第三个参数为 创建的线程执行函数 需要注意线程执行的函数模型需要其定义一致
第四个参数为 传递给线程函数的参数 可以任意

收尸函数

int pthread_join(pthread_t thread, void **retval)
阻塞当前的线程,等待子线程结束。
第一个参数子线程PID
第二个参数子线程返回值

结束子线程

int pthread_cancel(pthread_t thread);
结束指定的子线程运行

线程间的同步互斥

1:信号灯

当涉及多个线程间调用,利用信号灯进行同步
1)初始化
int sem_init(sem_t *sem,int pshared,unsigned int value)
2)P操作
int sem_wait(sem_t *sem)
3)V操作
int sem_post(sem_t *sem)

2:互斥锁

当线程1,2都需要调用,并且互相打架时,使用互斥锁
1) 初始化互斥锁
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t *attr);
//初始化 互斥锁
//第一个参数表示 线程的的地址 定义一个 注意需要定义全局变量 共用
//第二个参数表示 互斥锁属性 一般采用NULL 表示默认属性
//成功返回0

2) 申请互斥锁
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
//申请 互斥锁
//互斥锁的ID
//成功返回0

3) 释放互斥锁
#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
//释放 互斥锁
//互斥锁的ID
//成功返回0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值