文章目录
举例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