Vue框架:
Vue驾校-从项目学Vue-1
算法系列博客友链:
神机百炼
含义:一个进程负责向文件写入内容,一个进程负责向文件读取内容,就像单向水流在水管中一样,所以叫“管道”
举例:bash进程下的两个命令行子进程之间使用匿名管道通信
为什么管道必须是文件,而不能是全局变量?
全局变量属于进程地址空间中的初始化/未初始化数据区,进程可以脱离OS直接对全局变量操作
也就是父子进程对全局变量操作时必然发生写时拷贝,导致父子进程看到的不是同一块空间,只能读取自己的空间
int pipefd[2];
if(pipe(pipefd) < 0){
perror(pipe error);
return -1;
}
#include
#include
#include
int main(){
int pipefd[2];
if(pipe(pipefd) < 0){
perror("pipe error");
return -1;
}
pid_t pid = fork();
if(pid < 0){
perror("fork error");
return -2;
}else if(pid == 0){
close(pipefd[1]);
char buffer[100];
while(read(pipefd[0], buffer, sizeof(buffer))){
printf("子进程读取到:%s\n",buffer);
}
close(pipefd[0]);
exit(0);
}else {
close(pipefd[0]);
char* msg = "pipe()匿名管道\n";
write(pipefd[1], msg, sizeof(msg));
printf("父进程写入完成\n");
close(pipefd[1]);
}
return 0;
}
who | wc -l
#who输出的是该主机上的用户
#wc -l统计输入内容条数
#define FILE_NAME = "name_pipe"
#define mode 0644
if(mkfifo(FILE_NAME, mode) < 0){
perror("mkfifo error");
return -1;
}
int fd = open(FILE_NAME, O_RDWR);
if(fd < 0){
perror("open error");
return -2;
}
参数:
返回值:
创建命名管道文件失败/已创建过:-1
if(access(FILE_NAME, F_OK)){
if(mkfifo(FILE_NAME, 0644) < 0){
perror("mkfifo error");
return -1;
}
}
#include
#include
#include
#include
#include
#include
#define FILE_NAME "name_pipe"
int main(){
if(access(FILE_NAME, F_OK)){
if(mkfifo(FILE_NAME, 0644) < 0){
perror("mkfifo error");
return -1;
}
}
pid_t pid = fork();
if(pid < 0){
perror("fork error");
return -2;
}else if(pid == 0){
int fd = open(FILE_NAME, O_RDONLY);
char buffer[100];
while(read(fd, buffer, sizeof(buffer))){
printf("子进程读取到:%s\n",buffer);
}
close(fd);
exit(0);
}else{
char* msg = "mkfifo命名管道\n";
int fd = open(FILE_NAME, O_WRONLY);
write(fd, msg, sizeof(msg));
printf("父进程写入完毕\n");
close(fd);
}
return 0;
}
mkfifo:
mkfifo fifo
#在本目录下创建管道文件fifo
> >> < <<:
cmd > file #将cmd的结果输出到file中,直接覆盖file
cmd >> file #将cmd的结果输出到file中,追加输出
cmd < file #将file中内容输出到cmd命令中
利用命名管道mkfifo实现内容写入:
基本原理:进程地址空间的共享内存部分指向内存中同一区域
操作步骤:
共享内存管理:
由于每个进程都可以创建共享内存,所以OS需要对所有共享内存进行管理
key_t key = ftok(FILE_NAME, PROJ_ID);
if(key < 0){
perror("ftok error");
return -1;
}
参数:
返回值:
int shmid = shmget(key, SIZE, IPC_CREAT|IPC_EXCL|0644);
if(shmid < 0){
perror("shmget error");
return -1;
}
shmctl(shmid, IPC_RMID, NULL);
char* shm = shmat(shmid, NULL, 0);
shmdt(shm);
#ifndef _COMMON_H_
#define _COMMIN_H_
#include
#include
#include
#include
#include
#include
#define PATH_NAME "/home/whb/testipc"
#define PROJ_ID 0x8668 //此处可能冲突,报错就换个数字
#define SIZE 4096 //必须为1024倍数
#endif
#include "comm.h"
int main(){
key_t key = ftok(FILE_NAME, PROJ_ID);
if(key < 0){
perror("ftok error");
return -1;
}
int shmid = shmget(key, SIZE, IPC_CREAT);
if(shmid < 0){
perror("shmget error");
return -2;
}
char* shm = shmat(shmid, NULL, 0);
while(1){
printf("%s\n", shm);
}
shmdt(shmid);
return 0;
}
#include "comm.h"
int main(){
key_t key = ftok(FILE_NAME, PROJ_ID);
if(key < 0){
perror("ftok error");
return -1;
}
int shmid = shmget(key, SIZE, O_CREAT|O_EXCL|0644);
if(shmid < 0){
perror("shmger error");
return -2;
}
char* shm = shmat(shmid, NULL, 0);
int i=0;
while(1){
shm[i++] = 'A' + i;
shm[i] = 0;
sleep(1);
if(i == 27) break;
}
shmdt(shm);
return 0;
}
ipcs
###
------ Message Queues --------
key msqid owner perms used-bytes messages
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00005feb 0 root 666 12000 1
0x650101d0 1 whb 0 4096 0
------ Semaphore Arrays --------
key semid owner perms nsems
###
ipcrm -m shmid