进程:
目的:
- 数据传输: 一个进程数据发送给另一个进程.
- 资源的共享: 多个进程共享同样的资源.
- 通知事件: 一个进程向另一个或一组进程发送消息.
- 进程控制: 控制另一个进程.
现在Linux使用的进程间通信方式(IPC):
一.管道通信 (先进先出,单向)
1.
int pipe(int filedis[2])
filedis[0]:读管道.
filedis[1]:写管道.
关闭管道:close(filedis[0]);
必须先pipe()
否则子进程无法继承文件描述符.
2.
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode)
pathname:文件名.
mode:文件属性.
例子:
有名管道读写:
//read
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FIFO "/home/benson/test/ben1"
main(int argc,char** argv)
{
}
//write
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FIFO_SERVER "/home/benson/test/ben1"
main(int argc,char** argv)
{
}
二.信号通讯
几种常见的信号:
信号处理:
- 忽略信号. (SIGKILL 和 SIGSTOP 不能被忽略)
- 执行用户希望的动作.
- 执行系统默认的动作.(多数为终止该进程)
信号发送:#include <sys/types.h>
int kill(pid_t pid, int signo)
int raise(int signo)
kill:可以向自身或者是其他进程发送信号.
raise:只可以向自己发送信号.
kill的pid值的情况:
- pid > 0 :将信号发送给进程ID为pid的进程.
- pid == 0 :信号发送给同组的进程.
- pid < 0 :信号发送给|pid| (绝对值)的进程.
- pid == -1 :信号发送给所有的进程.
信号等待:#include <unistd.h>
unsigned int alarm(unsigned int seconds)
seconds:经过指定秒数后产生信号.
int pause(void)
只有执行了一个信号,函数pause是进程等待收到一个信号为止,挂起才结束.
信号处理:#include <signal.h>
void (*signal (int signo ,
====>> typedef void (*sighandler_t) (int)
====》》 sighandler_t
- func可能的值:SIG_IGN(忽略信号) , SIG_DFL(按系统默认方式处理) , 自定义的函数名
三.共享内存:多个进程共享一部分的物理内存,共享内存是进程间数据共享的一种最快的方法.
int shmget(key_t key, int size, int shmflg)
key:IPC_PRIVATE.
size:内存的大小.
shmflg:内存的属性. (文件属性)
返回值:返回共享内存的标识符,否则返回 -1.
int shmat(int shmid, char *shmaddr, int flag)
shmid:共享内存的标识符.
flag:以什么方式映射内存.
shmaddr:一般为0(系统帮找一块)
解除映射:int shmdt(char *shmaddr)
四.消息队列:1.POSIX消息队列,2.系统V(5)消息队列 (Linux特有)
功能:返回文件名对应的键值.
pathname:文件名.
proj:项目名.
int msgget(key_t key, int msgflag)
key:键值. (从ftok中获取)
msgflg:属性.
返回值:与键值相对应的消息队列描述符.
int msgsnd(int msqid, struct msgbuf *msgp, int msgsize, int msgflg)
msgid:已经打开的消息队列,从msgget中获取.
msgp:存放消息的结构.
msgsize:消息的大小.
msgflg:属性,一般为IPC_NOWAIT
struct msgbuf
{
};
int msgrcv(int msgid, struct msgbuf * msgp, int msgsize, long msgtyp, int msgflg)
msgtyp:可以为getpid()
其余同上~~
#include <sys/types.h>
#include <sys/msg.h>
#include <unistd.h>
struct msg_buf
int main()
{
}