进程
pid = fork();来创建子进程,除了PID = 0的进程是由操作系统启动时自动生成的,其他的都是根据已有进程创建的子进程
子进程“几乎”是父进程的完全复制。
运行一个进程时想执行另一个程序可使用exec函数族,先fork一个子进程,在里面调用exec执行新进程。(也可直接将一个进程改头换面)。
exit(——)可用于子进程返回(所有的进程都是子进程。。。),里面的参数会返回给他的父进程,父进程使用wait(&pid)来获取子进程的推出状态,即刚才的参数( waitpid() ) 。使用exit退出时会调用退出处理函数、清理I/O缓冲;而_exit却是直接退出。
守护进程,通常是那些随系统引导时启动,在进程结束时退出。基本操作是将一个子进程变为孤儿进程,会被PID = 1的进程接盘,然后在子进程中创建新会话,改变目录,重设权限,关闭文件描述符。
线程
创建:pthread_create(), 等待线程结束:pthread_join(), 线程退出:pthread_exit(), 取消线程:pthread_cancel()。
线程间同步和互斥机制:信号量, 互斥锁, 条件变量。
信号量sem 初始化:sem_init, P操作:sem_wait, V操作:sem_post, sem_trywait,, sem_getvalue;
互斥锁mutex 初始化:pthread_mutex_init, 申请:pthread_mutex_lock, 释放:pthread_mutex_unlock
进程间通信
管道pipe 创建无名管道pipe(int fd[2]), 两个进程中用fdopen打开管道返回文件操作符,可用write,read读写
管道FIFO 创建:mkfifo, 可以对管道文件进行读写操作,不能lseek。文件内容先进先出。
信号signal kill(); raise(); alarm(); pause(); signal();
共享内存 shmget()创建共享内存( 可使用ftok()返回特定的key作参数),返回共享内存标识符,共享内存位于3G~4G的内核拥有的内存区域。
使用shmat映射到需要使用共享内存的进程的内存中(size一样),返回映射到的地址。
shmdt取消本进程对某个共享内存的映射。(网上说当最后一个进程也取消时,共享内存会自动销毁,但事实并不是如此)。
shmctl()通过共享内存标识符对共享内存进行操作,可删除。
消息队列msg msgget返回消息队列ID,(也可使用ftok返回的key作为参数);使用msgctl获取消息队列属性或者删除队列。
msgsnd往消息队列发送消息,msgrcv获取消息。
信号灯semaphore semget获取信号灯集ID(同样使用ftok获得key作为参数);semctl获取/设置/删除信号灯(的值);
semop进行操作(PV).
进程间通信方式比较
pipe:具有亲缘关系的进程间,单工,数据在内存中
fifo:可用于任意进程间,双工,有文件名,数据在内存
signal:唯一的异步通信方式
msg:常用于cs模式中,按消息类型访问,可有优先级
shm:效率最高(直接访问内存),需要同步,互斥机制
sem:配合共享内存使用,用以实现同步和互斥