有名管道实现进程通信(2个客户端互聊)

有名管道实现进程通信(2个客户端互聊)

client1.c

#include<stdio.h>
#include<error.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<signal.h>
#define MSG_LEN 50
#define NAME_LEN 16
#define MSG_PATH "/tmp/msg"


typedef struct msg_pakage
{
    
    
    pid_t src_pid;
    pid_t dest_pid;
    char message[MSG_LEN];
}MP;

typedef struct client_info
{
    
    
   int fifo_fd;
   pid_t pid_no;
   char name[NAME_LEN];
}CI ;

CI my_ci,dest_ci;

void connect(int num);
void get_msg(int num);
int main()
{
    
    
    int ret;
    my_ci.pid_no = getpid();
    strcpy(my_ci.name,"莫邪");
    if(access(MSG_PATH,F_OK))
    {
    
    
       ret  = mkfifo(MSG_PATH,0777);
       if(ret == -1)
       {
    
    
           perror("mkfifo error.\n");
           return -1;
       }
    }
    my_ci.fifo_fd = open(MSG_PATH,O_RDWR);
    if(my_ci.fifo_fd == -1)
    {
    
    
        perror("open fifo error.\n");
        return -1;
    }
    read(my_ci.fifo_fd,&dest_ci,sizeof(dest_ci));
    printf("我是%s,我连接上了:%s\n",my_ci.name,dest_ci.name);
    kill(dest_ci.pid_no,SIGUSR1);

    sleep(1);
    ret = write(my_ci.fifo_fd,&my_ci,sizeof(my_ci));
    if(ret == -1)
    {
    
    
        perror("write error.\n");
        return -1;
    }
    signal(SIGUSR2,get_msg);

    while(1)
    {
    
    
        MP send_mp;
        send_mp.dest_pid = dest_ci.pid_no;
        send_mp.src_pid = my_ci.pid_no;
        fgets(send_mp.message,MSG_LEN,stdin);
        write(my_ci.fifo_fd,&send_mp,sizeof(send_mp));
        kill(dest_ci.pid_no,SIGUSR2);
        sleep(1);
    }
    return 0;
}

void get_msg(int num)
{
    
    
    MP msg ;
    read(my_ci.fifo_fd,&msg,sizeof(msg));
    if(msg.dest_pid == my_ci.pid_no)
        printf("%s说:%s\n",dest_ci.name,msg.message);
}


client2.c

#include<stdio.h>
#include<error.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<signal.h>
#define MSG_LEN 50
#define NAME_LEN 16
#define MSG_PATH "/tmp/msg"


typedef struct msg_pakage
{
    
    
    pid_t src_pid;
    pid_t dest_pid;
    char message[MSG_LEN];
}MP;

typedef struct client_info
{
    
    
   int fifo_fd;
   pid_t pid_no;
   char name[NAME_LEN];
}CI ;

CI my_ci,dest_ci;

void connect(int num);
void get_msg(int num);
int main()
{
    
    
    int ret;
    signal(SIGUSR1,connect);
    my_ci.pid_no = getpid();
    strcpy(my_ci.name,"干将");
    if(access(MSG_PATH,F_OK))
    {
    
    
       ret  = mkfifo(MSG_PATH,0777);
       if(ret == -1)
       {
    
    
           perror("mkfifo error.\n");
           return -1;
       }
    }
    my_ci.fifo_fd = open(MSG_PATH,O_RDWR);
    if(my_ci.fifo_fd == -1)
    {
    
    
        perror("open fifo error.\n");
        return -1;
    }

    ret = write(my_ci.fifo_fd,&my_ci,sizeof(my_ci));
    if(ret == -1)
    {
    
    
        perror("write error.\n");
        return -1;
    }
    signal(SIGUSR2,get_msg);
    while(1)
    {
    
    
        MP send_mp;
        send_mp.dest_pid = dest_ci.pid_no;
        send_mp.src_pid = my_ci.pid_no;
        fgets(send_mp.message,MSG_LEN,stdin);
        write(my_ci.fifo_fd,&send_mp,sizeof(send_mp));
        kill(dest_ci.pid_no,SIGUSR2);
        sleep(1);
    }
    return 0;
}

void connect(int num)
{
    
    
    
    read(my_ci.fifo_fd,&dest_ci,sizeof(CI));
    printf("我是:%s,我连接上了%s\n",my_ci.name,dest_ci.name);
    
}
void get_msg(int num)
{
    
    
    MP msg ;
    read(my_ci.fifo_fd,&msg,sizeof(msg));
    if(msg.dest_pid == my_ci.pid_no)
        printf("%s说:%s\n",dest_ci.name,msg.message);
}

Guess you like

Origin blog.csdn.net/m0_37546257/article/details/110959321