有名管道实现进程通信(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);
}