linuxC多进程通讯---fifo应用实战(服务端和客户端应用通讯)

举例1:服务端、客户端进程通过FIFO实现双向通信

在这里插入图片描述

客户端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#define FIFO_SERVER "fifo_server"
#define FIFO_CLIENT "fifo_client"

int main (void)
{
	mkfifo (FIFO_SERVER, 0644);
	mkfifo (FIFO_CLIENT, 0644);

	int ret_from_fork;
	ret_from_fork = fork ();
	if (ret_from_fork == -1)
	{
		perror ("fork");
		exit (EXIT_FAILURE);
	}
	else if (ret_from_fork == 0)  // child process: write
	{  
		int fd_fifo_write;
		fd_fifo_write = open (FIFO_SERVER, O_WRONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			scanf ("%s", buf);
			write (fd_fifo_write, buf, strlen (buf) + 1);
		}
		_exit (EXIT_SUCCESS);
	}
	else              			// parent process: read
	{
		int fd_fifo_read;
		fd_fifo_read = open (FIFO_CLIENT, O_RDONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			if (read (fd_fifo_read, buf, 100) > 0)
				printf ("server: %s\n", buf);
		}
		exit (EXIT_SUCCESS);
	}
	return 0;
}

服务端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#define FIFO_SERVER "fifo_server"
#define FIFO_CLIENT "fifo_client"

int main (void)
{
	mkfifo (FIFO_SERVER, 0644);
	mkfifo (FIFO_CLIENT, 0644);

	int ret_from_fork;
	ret_from_fork = fork ();
	if (ret_from_fork == -1)
	{
		perror ("fork");
		exit (EXIT_FAILURE);
	}
	else if (ret_from_fork == 0) //child process: write
	{
		int fd_fifo_write;
		fd_fifo_write = open (FIFO_CLIENT, O_WRONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			scanf ("%s", buf);
			write (fd_fifo_write, buf, strlen (buf) + 1);
		}
		_exit (EXIT_SUCCESS);
	}
	else
	{                         //parent process: read
		int fd_fifo_read;
		fd_fifo_read = open (FIFO_SERVER, O_RDONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			if (read (fd_fifo_read, buf, 100) > 0)
				printf ("client: %s\n", buf);
		}
		exit (EXIT_SUCCESS);
	}
	return 0;
}

举例2:2个客户端进程通过服务端实现双向通信

在这里插入图片描述

服务端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#define FIFO_SERVER "fifo_server"
#define FIFO_CLIENT_1 "fifo_client1"
#define FIFO_CLIENT_2 "fifo_client2"

int main (void)
{
	mkfifo (FIFO_SERVER, 0644);
	mkfifo (FIFO_CLIENT_1, 0644);
	mkfifo (FIFO_CLIENT_2, 0644);
	int ret_from_fork;
	int buf_ready = 0;
	char public_buf[100];
		
	int fifo_fd_read;
	fifo_fd_read = open (FIFO_SERVER, O_RDONLY);
	memset (public_buf, 0, 100);

	int fifo_fd_write1;
	int fifo_fd_write2;
	fifo_fd_write1 = open (FIFO_CLIENT_1, O_WRONLY);
	fifo_fd_write2 = open (FIFO_CLIENT_2, O_WRONLY);
	int read_len;
	while (1)
	{
		read_len = read (fifo_fd_read, public_buf, 100);
		if (read_len == -1)
		{
			perror ("read");
			exit (EXIT_FAILURE);
		}
		else if (read_len > 0)
		{
			printf ("%s\n", public_buf);
			if (public_buf[0] == '1')
				write (fifo_fd_write1, public_buf + 1, strlen (public_buf));
			else if (public_buf[0] == '2')
				write (fifo_fd_write2, public_buf + 1, strlen (public_buf));
		}
		sleep (1);
	}
	return 0;
}

客户端1

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#define FIFO_SERVER "fifo_server"
#define FIFO_CLIENT_1 "fifo_client1"

int main (void)
{
	mkfifo (FIFO_SERVER, 0644);
	mkfifo (FIFO_CLIENT_1, 0644);
	int ret_from_fork;
	ret_from_fork = fork ();
	if (ret_from_fork == -1)
	{
		perror ("fork");
		exit (EXIT_FAILURE);
	}
	else if (ret_from_fork == 0)  // child process 1: write
	{  
		int fifo_fd_write;
		fifo_fd_write = open (FIFO_SERVER, O_WRONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			buf[0] = '2';
			scanf ("%s", buf + 1);
			write (fifo_fd_write, buf, strlen (buf) + 1);
		}
		_exit (EXIT_SUCCESS);
	}
	else              			// parent process: read
	{
		int fifo_fd_read;
		fifo_fd_read = open (FIFO_CLIENT_1, O_RDONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			if (read (fifo_fd_read, buf, 100) > 0)
			{
				printf ("client2: %s\n", buf);
			}
		}
		exit (EXIT_SUCCESS);
	}
	return 0;
}

客户端2

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#define FIFO_SERVER "fifo_server"
#define FIFO_CLIENT_2 "fifo_client2"

int main (void)
{
	mkfifo (FIFO_SERVER, 0644);
	mkfifo (FIFO_CLIENT_2, 0644);
	int ret_from_fork;
	ret_from_fork = fork ();
	if (ret_from_fork == -1)
	{
		perror ("fork");
		exit (EXIT_FAILURE);
	}
	else if (ret_from_fork == 0)  // child process 2: write
	{  
		int fifo_fd_write;
		fifo_fd_write = open (FIFO_SERVER, O_WRONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			buf[0] = '1';
			scanf ("%s", buf + 1);
			write (fifo_fd_write, buf, strlen (buf) + 1);
		}
		_exit (EXIT_SUCCESS);
	}
	else              			// parent process: read
	{
		int fifo_fd_read;
		fifo_fd_read = open (FIFO_CLIENT_2, O_RDONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			if (read (fifo_fd_read, buf, 100) > 0)
				printf ("client1: %s\n", buf);
		}
		exit (EXIT_SUCCESS);
	}
	return 0;
}

举例3:多个客户端进程通过服务端实现通信


在这里插入图片描述

客户端1

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#define FIFO_SERVER "fifo_server"
#define FIFO_CLIENT_1 "fifo_client1"

int main (void)
{
	mkfifo (FIFO_SERVER, 0644);
	mkfifo (FIFO_CLIENT_1, 0644);
	int ret_from_fork;
	ret_from_fork = fork ();
	if (ret_from_fork == -1)
	{
		perror ("fork");
		exit (EXIT_FAILURE);
	}
	else if (ret_from_fork == 0)  // child process 1: write
	{  
		int fd_fifo_write;
		fd_fifo_write = open (FIFO_SERVER, O_WRONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			buf[0] = '1';
			scanf ("%s", buf + 1);
			write (fd_fifo_write, buf, strlen (buf) + 1);
		}
		_exit (EXIT_SUCCESS);
	}
	else              			// parent process: read
	{
		int fd_fifo_read;
		fd_fifo_read = open (FIFO_CLIENT_1, O_RDONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			if (read (fd_fifo_read, buf, 100) > 0)
			{
				printf ("client%c: %s\n", buf[0], buf + 1);
			}
		}
		exit (EXIT_SUCCESS);
	}
	return 0;
}

客户端2

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#define FIFO_SERVER "fifo_server"
#define FIFO_CLIENT_2 "fifo_client2"

int main (void)
{
	mkfifo (FIFO_SERVER, 0644);
	mkfifo (FIFO_CLIENT_2, 0644);
	int ret_from_fork;
	ret_from_fork = fork ();
	if (ret_from_fork == -1)
	{
		perror ("fork");
		exit (EXIT_FAILURE);
	}
	else if (ret_from_fork == 0)  // child process 2: write
	{  
		int fd_fifo_write;
		fd_fifo_write = open (FIFO_SERVER, O_WRONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			buf[0] = '2';
			scanf ("%s", buf + 1);
			write (fd_fifo_write, buf, strlen (buf) + 1);
		}
		_exit (EXIT_SUCCESS);
	}
	else              			// parent process: read
	{
		int fd_fifo_read;
		fd_fifo_read = open (FIFO_CLIENT_2, O_RDONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			if (read (fd_fifo_read, buf, 100) > 0)
				printf ("client%c: %s\n", buf[0], buf + 1);
		}
		exit (EXIT_SUCCESS);
	}
	return 0;
}

客户端3

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#define FIFO_SERVER "fifo_server"
#define FIFO_CLIENT_3 "fifo_client3"

int main (void)
{
	mkfifo (FIFO_SERVER, 0644);
	mkfifo (FIFO_CLIENT_3, 0644);
	int ret_from_fork;
	ret_from_fork = fork ();
	if (ret_from_fork == -1)
	{
		perror ("fork");
		exit (EXIT_FAILURE);
	}
	else if (ret_from_fork == 0)  // child process 3: write
	{  
		int fd_fifo_write;
		fd_fifo_write = open (FIFO_SERVER, O_WRONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			buf[0] = '3';
			scanf ("%s", buf + 1);
			write (fd_fifo_write, buf, strlen (buf) + 1);
		}
		_exit (EXIT_SUCCESS);
	}
	else              			// parent process: read
	{
		int fd_fifo_read;
		fd_fifo_read = open (FIFO_CLIENT_3, O_RDONLY);
		char buf[100];
		while (1)
		{
			memset (buf, 0, 100);
			if (read (fd_fifo_read, buf, 100) > 0)
				printf ("client%c: %s\n", buf[0], buf + 1);
		}
		exit (EXIT_SUCCESS);
	}
	return 0;
}

服务端

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#define FIFO_SERVER "fifo_server"
#define FIFO_CLIENT_1 "fifo_client1"
#define FIFO_CLIENT_2 "fifo_client2"
#define FIFO_CLIENT_3 "fifo_client3"

int main (void)
{
	mkfifo (FIFO_SERVER, 0644);
	mkfifo (FIFO_CLIENT_1, 0644);
	mkfifo (FIFO_CLIENT_2, 0644);
	mkfifo (FIFO_CLIENT_3, 0644);

	int ret_from_fork;
	int buf_ready = 0;
	char public_buf[100];
		
	int fd_fifo_read;
	fd_fifo_read = open (FIFO_SERVER, O_RDONLY);
	memset (public_buf, 0, 100);


	int fd_fifo_write1;
	int fd_fifo_write2;
	int fd_fifo_write3;
	fd_fifo_write1 = open (FIFO_CLIENT_1, O_WRONLY);
	fd_fifo_write2 = open (FIFO_CLIENT_2, O_WRONLY);
	fd_fifo_write3 = open (FIFO_CLIENT_3, O_WRONLY);

	int read_len;
	while (1)
	{
		read_len = read (fd_fifo_read, public_buf, 100);
		if (read_len == -1)
		{
			perror ("read");
			exit (EXIT_FAILURE);
		}
		else if (read_len > 0)
		{
			printf ("%s\n", public_buf);
			if (public_buf[1] == '1')
			{
				public_buf[1] = public_buf[0]; // save sent ID
				write (fd_fifo_write1, public_buf + 1, strlen (public_buf));
			}
			else if (public_buf[1] == '2')
			{
				public_buf[1] = public_buf[0]; 
				write (fd_fifo_write2, public_buf + 1, strlen (public_buf));
			}
			else if (public_buf[1] == '3')
			{
				public_buf[1] = public_buf[0]; 
				write (fd_fifo_write3, public_buf + 1, strlen (public_buf));
			}
			else   // options
				continue;
		}
		sleep (1);
	}
	return 0;
}

readme

usages:
	eg: client1 sent "hello" to client2
	process1: 2hello

text structure in server FIFO:
    sentID receiverID text
	12hello

发布了349 篇原创文章 · 获赞 6 · 访问量 9752

猜你喜欢

转载自blog.csdn.net/qq_23929673/article/details/99816047