无名管道pipe
无名管道有一定的局限性。
第一:它是属于半双工的通信方式;
第二:只有具有“亲缘关系”的的进程才能使用这种通信方式,也就是父进程和子进程之
间。
int pipe(int pipefd[2])
参数pipefd[0]:用于读管道。
参数pipefd[1]:用于写管道。
返回值:执行成功返回0,失败返回-1
1.创建管道 rc = pipes(pipes);
2.读
2.写
有名管道fifo 给文件系统提供一个路径,这个路径和管道关联,只要知道这个管道路径,
就可以进行文件访问,fifo 是指先进先出,也就是先写入的数据,先读出来。
int mkfifo(const char pathname, mode_t mode);
参数pathname:路径名,管道名称。
参数mode:管道的权限。
返回值:成功返回0,错误返回-1。
1.创建 res = mkfifo(fifo_name,0777);
2.打开 fifo and file1
pipe_fd = open(fifo_name , O_WRONLY);
data_fd = open(file1 , O_RDONLY);
3. bytes_read = read(data_fd , buffer , PIPE_BUF);
4. buffer[bytes_read] = ‘\0’;
5. 任务1:向FIFO文件写数据 res = write(pipe_fd , buffer , bytes_read);
6. 任务:writerpipe:向FIFO文件读数据 res = read(pipe_fd , buffer , PIPE_BUF);
17.5 消息队列msg
函数int msgsnd(int msqid, const void msgp, size_t msgsz, int msgflg);
参数msqid:消息队列的标识码。
参数msgp:指向消息缓冲区的指针,此位置用来暂时存储发送和接收的消息,是一个用
户可定义的通用结构。
参数msgsz:消息的长短。
参数msgflg:标志位。
返回值:成功返回0,错误返回-1。
函数ssize_t msgrcv(int msqid, void msgp, size_t msgsz, long msgtyp,int msgflg);
参数msqid:消息队列的标识码。
参数msgp:指向消息缓冲区的指针。
参数msgsz:消息的长短
参数msgflg:标志位。
返回值:成功返回数据长度,错误返回-1。
结构体msgp,是一个标准的通用结构,如下所示。
struct msgstru{
long mtype; //大于0
char mtext[nbyte];
};
还有一个函数msgget 需要介绍,用来获取与某个键“key”关联的消息队列标识。
函数int msgget(key_t key, int msgflg):
参数“key”:消息队列关联的键。
参数“msgflg”:消息队列的建立标志和存取权限。IPC_CREAT 如果内核中没有此队列,
则创建它;IPC_EXCL 当和IPC_CREAT 一起使用时,如果队列已经存在,则失败。
返回值:执行成功则返回消息队列的标识符,否则返回-1。
msgctl(msgid,IPC_RMID,0) 删除消息列队
send
1.建立消息列队 msgid = msgget((key_t)1234 , 0666 | IPC_CREAT);
2.msgsnd(msgid , (void*)&data , MAX_TEXT,0)
receive
1.建立
2.msgrcv(msgid , (void*) &data , BUFSIZ , msgtype ,0);
3.不需要使用后删除 msgctl(msgid , IPC_RMID , 0)
17.6 信号signal
unsigned int alarm(unsigned int seconds);
参数seconds:闹钟的时间,单位为秒。
返回值:成功返回0 或者返回剩余时间;错误返回-1。
sighandler_t signal(int signum, sighandler_t handler);
参数signum:等待的信号。
参数handler:信号到来之后,触发的处理方式。
返回值:成功返回0,错误返回-1。
https://blog.youkuaiyun.com/weibo1230123/article/details/81505152
Linux进程间通信(一): 信号 signal()、sigaction()
Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()
https://www.cnblogs.com/52php/p/5813867.html
https://www.cnblogs.com/52php/p/5815125.html
SIGINT信号代表由InterruptKey产生,通常是CTRL +C 或者是DELETE 。执行上述代码时,按下CTRL + C程序没有反应。这就对了,如果我们想结束该程序可以按下CTRL +\来结束,当我们按下CTRL +\组合键时,产生了SIGQUIT信号,此信号并没有被忽略。
int sigemptyset(sigset_t *set);
该函数的作用是将信号集初始化为空。
igaddset(增加一个信号至信号集)
相关函数
sigemptyset,sigfillset,sigdelset,sigismember
表头文件
#include<signal.h>
定义函数
int sigaddset(sigset_t *set,int signum);
函数说明
sigaddset()用来将参数signum 代表的信号加入至参数set 信号集里。
返回值
执行成功则返回0,如果有错误则返回-1。
错误代码
EFAULT 参数set指针地址无法存取
EINVAL 参数signum非合法的信号编号
17.7 信号量Semaphore
int semget(key_t key, int nsems, int semflg);
参数key:一个用来允许不相关的进程访问相同信号量的整数值。
参数nsems:需要的信号量数目。这个值通常总是1。
参数semflg:标记集合,与open 函数的标记十分类似。
返回值:成功返回标识符,用于其它信号函数,错误返回-1。
https://www.cnblogs.com/52php/p/5851570.html
17.8 共享内存shmdata
共享内存是进程间通信中最简单的方式之一。共享内存在各种进程间通信方式中具有最高
的效率。因为系统内核没有对访问共享内存进行同步,您必须提供自己的同步措施。解决这些
问题的常用方法是通过使用信号量进行同步。
函数int shmget(key_t key, size_t size, int shmflg);
参数key:建立新的共享内存对象
参数size:新建立的内存大小
参数shmflg:标识符
返回值:成功shmget 返回一个共享内存标识符或创建一个共享内存对象,错误返回-1。
void *shmat(int shmid, const void *shmaddr, int shmflg)
参数shmid:共享内存标识符
参数shmaddr:指定共享内存出现在进程内存地址的什么位置,直接指定为NULL 让内核
自己决定一个合适的地址位置
参数shmflg :SHM_RDONLY,为只读模式,其他为读写模式
返回值:成功返回共享的内存地址,否则返回-1。
int shmdt(const void *shmaddr)
参数shmaddr:连接的共享内存的起始地址。
返回值:成功返回0,错误返回-1。
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
参数shmid:共享内存标识符
参数cmd IPC_RMID:删除这片共享内存
参数buf:共享内存管理结构体