Programación del sistema Linux 63 procesos, comunicación entre subprocesos 1 tubo

Misma comunicación de escritorio:

管道
XSI	:消息队列,信号量数组,共享内存

Comunicación entre diferentes máquinas

socket 网络套接字

La canalización debe constituir los lados de lectura y escritura.
Proporcionado por el mecanismo de sincronización automática del núcleo, símplex

Canal anónimo : piepe (), no se puede ver ningún archivo en el disco, lo que equivale a darnos un descriptor de archivo o ARCHIVO * directamente. El resultado más directo es que si no existe una relación de sangre entre los dos procesos, los conductos anónimos no se pueden utilizar para la comunicación, porque el otro proceso no puede encontrar la ubicación del archivo.

Canalización con nombre : mkfifo (), el tipo de archivo P como se ve desde el disco. Las canalizaciones con nombre se pueden utilizar para comunicarse entre procesos que no están relacionados. Esencialmente, es un archivo que existe en el disco actual. Archivo P

Creación de canalización anónima

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.

Creación de tubería con nombre

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). 

Inserte la descripción de la imagen aquí

Experimento 1: canalización anónima: proceso padre-hijo escribe el padre y el hijo lee, canalización anónima

#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);
}

Supongo que te gusta

Origin blog.csdn.net/LinuxArmbiggod/article/details/114849260
Recomendado
Clasificación