Comunicação da mesma mesa:
管道
XSI :消息队列,信号量数组,共享内存
Comunicação entre diferentes máquinas
socket 网络套接字
O pipeline deve constituir os lados de leitura e gravação.
Fornecido pelo kernel, simplex, mecanismo de auto-sincronização
Pipe anônimo : piepe (), nenhum arquivo pode ser visto no disco, o que equivale a nos fornecer um descritor de arquivo ou FILE * diretamente. O resultado mais direto é que, se não houver relação de sangue entre os dois processos, os pipes anônimos não podem ser usados para comunicação, porque o outro processo não consegue encontrar a localização do arquivo.
Canal com nome : mkfifo (), o tipo de arquivo P visto do disco. Pipes nomeados podem ser usados para se comunicar entre processos não relacionados. Basicamente, é um arquivo que existe no disco atual. Arquivo P
Criação anônima de pipeline
NAME
pipe, pipe2 - create pipe
SYNOPSIS
#include <unistd.h>
/*
pipe()返回两个文件描述符填充到 pipefd[]数组中。
pipefd[0]为读端,pipefd[1]为写端,
*/
int pipe(int pipefd[2]);
RETURN VALUE
On success, zero is returned. On error, -1 is returned, and errno is set appropriately.
Criação de pipe nomeado
NAME
mkfifo, mkfifoat - make a FIFO special file (a named pipe)
SYNOPSIS
#include <sys/types.h>
#include <sys/stat.h>
/*
指定我们所创建的命名管道的名字
指定操作权限
*/
int mkfifo(const char *pathname, mode_t mode);
RETURN VALUE
On success mkfifo() and mkfifoat() return 0. In the case of an error, -1 is returned (in which case, errno is set appropriately).
Experimento 1: canal anônimo: processo pai-filho pai escreve e filho lê, canal anônimo
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#define BUFSIZE 1024
int main()
{
int pd[2];
pid_t pid;
char buf[BUFSIZE];
int len;
if(pipe(pd) < 0)//先创建匿名管道
{
perror("poipe()");
exit(1);
}
pid = fork();//再创建子进程
if(pid < 0)
{
perror("fork()");
exit(1);
}
if(pid == 0) // Child read
{
close(pd[1]); //关闭写段
len = read(pd[0],buf,BUFSIZE); //读取读段
write(1,buf,len);//将读取的内容输出到终端
close(pd[0]);//关闭读端
exit(0);
}
else //Parent write
{
write(pd[1],"Hello!",6);//向写段写
close(pd[0]); //关闭读端
close(pd[1]);//关闭写端
wait(NULL);//等收尸
exit(0);
}
exit(0);
}