进程间通讯-管道通讯
int pipe(init filedis[2])
功能:管道的创建
变量 作用
filedis[0] 用于读管道
filedis[1] 用于写s管道

int mkfifo(const char * pathname , mode_t mode)
功能:实名管道创建
变量 作用
pathname FIFO文件名
mode FIFO文件属性

FIFO文件属性:
O_RDONLY 以只读的方式打开文件 O_WRONLY 以只写的方式打开文件 O_RDWR 以读写的方式打开文件 O_APPEND 以追加的方式打开文件 O_CREAT 创建一个文件 O_EXEC 如果使用了O_CREAT而且文件存在,就会发生一个错误 O_NOBLOCK 以非阻塞的方式打开一个文件 O_TRUNC 如果文件已经存在,则删除文件的内容 注: 1.当使用O_NONBLOCK旗标时,打开FIFO文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO文件来读取,则写入的操作会返回ENXIO错误代码. 2.没有使用O_NONBLOCK旗标时,打开FIFO来读取的操作会等到其他进程打开FIFO文件来写入才正常返回.同样地,打开FIFO文件来写入的操作会等到其他 进程打开FIFO文件来读取后才正常返回.



进程间通讯-信号通讯

UNIX信号类型:
信号名 值 默认处理动作 发出信号的原因 符合标准 SIGHUP 1 终止程序 终端挂起 POSIX SIGINT 2 终止程序 中断键(如break)被按下 ANSI SIGQUIT 3 核心映像转储coredump 键盘的退出键被按下 POSIX SIGILL 4 core dump 遇到非法指令 ANSI SIGTRAP 5 core dump 跟踪捕捉 POSIX SIGIOT 6 core dump I/O捕捉指令,硬件故障 4.2 BSD SIGABRT 6 core dump 核心标准子例程abort发出 ANSI SIGEMT 7,-,7 core dump 仿真捕捉指令 4.2 BSD SIGFPE 8 core dump 浮点异常 ANSI SIGKILL 9 终止程序 终止程序 POSIX SIGBUS 10,7,10 core dump 总线错误 4.2 BSD SIGSEGV 11 core dump 段违例 ANSI SIGSYS 12,-,12 core dump 调用不存在的系统调用 SVID SIGPIPE 13 终止程序 写一个没有读端口的管道 POSIX SIGALRM 14 终止程序 实时定时器计时到 POSIX SIGTERM 15 终止程序 软件结束信号 ANSI SIGURG 16,23,21 忽略该信号 Socket出现紧急条件 4.2 BSD SIGSTOP 17,19,23 停止进程 停止进程(不能被捕捉或忽略) POSIX SIGTSTP 18,20,24 停止进程 从键盘产生的进程停止信号 POSIX SIGCONT 19,18,25 忽略该信号 进程继续(曾被停止的进程) POSIX SIGCHLD 20,17,18 忽略该信号 子进程状态改变 OSIX SIGCLD -,-,18 忽略该信号 同上(只是定义名字不同) SYSV SIGTTIN 21,21,26 停止进程 后台进程企图从控制终端读 POSIX SIGTTOU 22,22,27 停止进程 后台进程企图向控制终端写 POSIX SIGIO 23,29,22 忽略该信号 某I/O操作现在可以进行了 4.2 BSD SIGXCPU 24,24,30 终止程序 超出设定的CPU时间限制 4.2 BSD SIGXFSZ 25,25,31 终止程序 超出设定的文件大小限制 4.2 BSD SIGVTALRM 26,26,28 终止程序 实际时间报警时钟信号 4.2 BSD SIGPROF 27,27,29 终止程序 Profile定时器到时 4.2 BSD SIGWINCH 28,28,20 忽略该信号 窗口大小改变 4.3 BSD SIGINFO 29,-,- 忽略该信号 键盘请求状态信息 4.2 BSD SIGUSR1 30,10,16 终止程序 用户自定义信号1 POSIX SIGUSR2 31,12,17 终止程序 用户自定义信号2 POSIX SIGSTKFLT -,16,- 终止程序 协处理器堆栈错误 SYSV
int kill(pid_t pid , int signo)
功能:信号发送至进程号为PID的进程
变量 作用
pid 进程号
signo 信号值

int raise(int signo)
功能:信号发送至本进程
变量 作用
signo 信号值
注:参数pid的值 信号的接收进程 pid>0 进程ID为pid的进程 pid=0 同一个进程组的进程 pid<0&&pid!=-1 进程组ID为 -pid的所有进程 pid=-1 除发送进程自身外,所有进程ID大于1的进程
unsigned int alarm(unsigned int seconds)
功能:专门为SIGALRM信号而设,在指定的时间seconds秒后,将向进程本身发送SIGALRM信号,又称为闹钟时间.进程调用alarm后,任何以前的alarm()调用都将无效.
如果参数seconds为零,那么进程内将不再包含任何闹钟时间.返回值,如果调用alarm()前,进程中已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0.



进程间通讯-信号处理

void (*signal(int signo , void (*handler)(int)))(int)
如果signal()调用成功,返回最后一次为信号值signo而调用signal()时的handler值,失败则返回SIG_ERR.
拆分理解:
typedef void (*sighandler_t)(int)
sighandler_t signal(int signo , sighandler_t handler)
变量 作用
signo 信号值
handler 针对前面信号值的处理
handler值:
1.SIG_IGN 忽略此信号 2.SIG_DFL 按系统默认方式处理 3.指定一个函数地址



进程间通讯-共享内存

int shmget (key_t key , int size , int flag)
功能:创建共享内存
返回值:成功返回共享存储的id,失败返回-1
变量 作用
key 标识符的规则(0/IPC_PRIVATE)
size 共享存储段的字节数
flag 读写的权限
注:如果key取值为IPC_PRIVATE时,则shmget将创建一个新的共享内存,如果key的取值为0,而参数flag中又设置了IPC_PRIVATE标识时,则同样会创建一块新的共享内存.

int shmat(int shmid , char *shmaddr , int flag)
功能:映射共享内存
返回值:如果成功,返回共享存储段地址,出错返回-1
变量 作用
shmid 共享存储的id,shmget函数返回的共享储存标识符
addr 一般为0,表示连接到由内核选择的第一个可用地址上,否则,如果flag没有指定SHM_RND,则连接到addr所指定的地址上,如果flag为SHM_RND,则地址取整
flag 如前所述,一般为0

int shmdt(void *addr);
功能:把共享内存从进程空间中脱离
shmdt将使相关shmid_ds结构中的shm_nattch计数器值减1
变量 作用
addr 共享存储段的地址,以前调用shmat时的返回值

int shmctl(int shmid,int cmd,struct shmid_ds *buf)
功能:提供了对共享内存段的多种控制(查询状态,修改状态,删除共享内存)
返回值:成功:0 失败:-1
变量 作用
shmid 共享内存的ID
cmd 控制命令
struct shmid_ds *buf 是一个结构体指针.IPC_STAT的时候,取得的状态放在这个结构体中.如果要改变共享内存的状态,用这个结构体指定

cmd的取值:
IPC_STAT 得到共享内存的状态 IPC_SET 改变共享内存的状态 IPC_RMID 删除共享内存



进程间通讯-消息列队

key_t ftok(char *pathname , char proj)
功能:获取pathname文件的键值
返回值:返回文件名对应的键值
变量 作用
pathname 文件名(默认为当前目录)
proj 项目名(不为0即可)
int msgget(key_t key , int msgflg)
功能:创建消息队列
返回值:与键值key相对应的消息队列描述字
变量 作用
key 键值,由ftok获得
msgflg 标志位

msgflg的取值:
IPC_CREAT 创建新的消息队列 IPC_EXCL 与IPC_CREAT一同使用,如果要创建的消息队列已经存在,则返回错误 IPC_NOWAIT 读写消息队列要求无法得到满足时,不阻塞
int msgsnd(int msgqid , struct msgbuf* msgp , int msgsz , int msgfig)
功能:将消息送入消息队列
返回值:成功执行时,msgsnd()返回0,失败返回-1
变量 作用
msqid 消息队列创建的返回值
msgp 指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构
msgsz 消息数据长度
msgflg 用来指明核心程序在队列没有数据的情况下所应采取的行动.如果msgflg和常数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而会立即返回-1,如果
执行的是msgrcv(),则在消息队列呈空时,不做等待马上返回-1,并设定错误码为ENOMSG.当msgflg 为0时,msgsnd()及msgrcv()在队列呈满或呈空的情形时,采取阻塞等待的处理模式

msgp形态如下
struct msgbuf { long mtype; /*消息类型,必须 > 0*/ char mtext[1]; /*消息文本*/ };
int msgrcv(int msqid , struct msgbuf* msgp , int msgsz , long msgtyp , int msgflg)
功能:将消息送入消息队列
返回值:成功执行时,msgsnd()返回0,失败返回-1
变量 作用
msqid 消息队列创建的返回值
msgp 指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用户可定义的通用结构
msgsz 消息数据长度
msgtyp 从消息队列内读取的消息形态.如果值为零,则表示消息队列中的所有消息都会被读取.
msgflg 用来指明核心程序在队列没有数据的情况下所应采取的行动.如果msgflg和常数IPC_NOWAIT合用,则在msgsnd()执行时若是消息队列已满,则msgsnd()将不会阻塞,而会立即返回-1,如
果执行的是msgrcv(),则在消息队列呈空时,不做等待马上返回-1,并设定错误码为ENOMSG.当msgflg 为0时,msgsnd()及msgrcv()在队列呈满或呈空的情形时,采取阻塞等待的处理模式.

msgp形态如下
struct msgbuf { long mtype; /*消息类型,必须 > 0*/ char mtext[1]; /*消息文本*/ };



进程间通讯-信号量

int semget(key_t key , int nsems , int semflg)
功能:创建信号
变量 作用
key 键值,由ftok获得
nsems 指定打开或者新创建的信号灯集中将包含信号灯的数目
semflg 标识,同消息列队

int semop(int semid , struct sembuf *sops , unsigned nsops)
功能:对信号量进行控制
变量 作用
semid 信号量集的ID
sops 是一个操作数组,表面要进行什么操作
sem_op 如果其值为正数,该值会加到现有的信号内含值中.通常用于释放所控资源的使用权;如果sem_op的值为负数,而其绝对值又大于信号的现值,操作将会阻塞,直到信号值大于或等于sem_op的绝对值.通常用于获取资源的使用权;如果sem_op的值为0,则操作将暂时阻塞,直到信号的值变为0.
sem_flg 信号操作标志
nsops sops所指向的数组的元素个数.

参数sops指向由sembuf组成的数组.此数组是在linux/sem.h中定义的:
struct sembuf{ ushortsem_num; /*semaphore index in array*/ shortsem_op; /*semaphore operation*/ shortsem_flg; /*operation flags*/ };
sem_flg可能的选择有两种:
IPC_NOWAIT 对信号的操作不能满足时,semop()不会阻塞,并立即返回,同时设定错误信息. IPC_UNDO 程序结束时(不论正常或不正常),保证信号值会被重设为semop()调用前的值.这样做的目的在于避免程序在异常情况下结束时未将 锁定的资源解锁,造成该资源永远锁定.