两个进程间通过服务器双向通信的问题,自己搞了半天才弄的基本可以通信了,不过好像没解决同步互斥问题
______server.c_____#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <pthread.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#define SIZE 1024
sem_t sem[4];
void f_exchange1_2(void);
void f_exchange3_4(void);
int main()
{
if(0 > mkfifo("/tmp/FIFO1", 0666)); //建4个管道
{
if(EEXIST != errno)
{
perror("mkfifo1");
exit(-1);
}
}
if(0 > mkfifo("/tmp/FIFO2", 0666));
{
if(EEXIST != errno)
{
perror("mkfifo2");
exit(-1);
}
}
if(0 > mkfifo("/tmp/FIFO3", 0666));
{
if(EEXIST != errno)
{
perror("mkfifo3");
exit(-1);
}
}
if(0 > mkfifo("/tmp/FIFO4", 0666));
{
if(EEXIST != errno)
{
perror("mkfifo4");
exit(-1);
}
}
if(0 >sem_init(&sem[0], 0, 1)) //四个信号灯,准备用来解决同步互斥的,还没用上,所以这儿应该有安全隐患
{
perror("sem_init0");
exit(-1);
}
if(0 >sem_init(&sem[1], 0, 0))
{
perror("sem_init1");
exit(-1);
}
if(0 >sem_init(&sem[2], 0, 1))
{
perror("sem_init2");
exit(-1);
}
if(0 >sem_init(&sem[3], 0, 0))
{
perror("sem_init3");
exit(-1);
}
pthread_t pid[2];
int ret1 = pthread_create(&pid[0], NULL, (void *)f_exchange1_2, NULL); //建第一个线程
if(0 > ret1)
{
printf("pthread_create0:%s",strerror(ret1));
exit(-1);
}
int ret2 = pthread_create(&pid[1], NULL, (void *)f_exchange3_4, NULL);//第二个线程
if(0 > ret2)
{
printf("pthread_create0:%s",strerror(ret2));
exit(-1);
}
pthread_join(pid[0], NULL); //等线程一
pthread_join(pid[1], NULL); //等线程二
return 0;
}
void f_exchange1_2(void) //线程一调用函数,用于管道1的数据传到管道2(即客户1的数据传给客户2)
{
char buf1[SIZE] = {0}; //buf1用于中间交换的字符数组(之后都是buf用于中间缓存)
int fd1 = open("/tmp/FIFO1", O_RDWR);
if(0 > fd1)
{
printf("open1:%s\n",strerror(fd1));
exit(-1);
}
int fd2 = open("/tmp/FIFO2", O_RDWR);
if(0 > fd2)
{
printf("open2:%s\n",strerror(fd2));
exit(-1);
}
while(1)
{ //sem_wait(&sem[0]);
read(fd1, buf1, sizeof(buf1)-1);
write(fd2,buf1,sizeof(buf1));
//sem_post(&sem[1]);
}
}
void f_exchange3_4(void) //线程一调用函数,用于管道3的数据传到管道4(即客户2的数据传给客户1)
{
char buf2[SIZE] = {0};
int fd4 = open("/tmp/FIFO4", O_RDWR);
if(0 > fd4)
{
printf("open4:%s\n",strerror(fd4));
exit(-1);
}
int fd3 = open("/tmp/FIFO3", O_RDWR);
if(0 > fd3)
{
printf("open3:%s\n",strerror(fd3));
exit(-1);
}
while(1)
{ //sem_wait(&sem[2]);
read(fd3, buf2, sizeof(buf2)-1);
write(fd4,buf2,sizeof(buf2));
//sem_post(&sem[3]);
}
}
________quest1.c_________
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <pthread.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#define SIZE 1024
sem_t sem[2];
pthread_t pid[2];
void f_write(void );
void f_read(void );
int main()
{
if(0 >sem_init(&sem[0], 0, 1))
{
perror("sem_init0");
exit(-1);
}
if(0 >sem_init(&sem[1], 0, 0))
{
perror("sem_init1");
exit(-1);
}
int ret1 = pthread_create(&pid[0], NULL, (void *)f_write, NULL); //客户1的第1个线程
if(0 > ret1)
{
printf("pthread_create0:%s",strerror(ret1));
exit(-1);
}
int ret2 = pthread_create(&pid[1], NULL, (void *)f_read, NULL); //第二个线程
if(0 > ret2)
{
printf("pthread_create0:%s",strerror(ret2));
exit(-1);
}
pthread_join(pid[0], NULL);
pthread_join(pid[1], NULL);
return 0;
}
void f_write(void) //线程1调用的函数,用于管道1中写数据(即发消息给客户2)
{
int fd1 = open("/tmp/FIFO1", O_RDWR);
if(0 > fd1)
{
printf("open1:%s\n",strerror(fd1));
exit(-1);
}
char buf[SIZE] = {0};
while(1)
{
//sem_wait(&sem[0]);
printf("Enter a string:\n");
fgets(buf, sizeof(buf)-1,stdin);
write(fd1, buf, sizeof(buf)-1);
//sem_post(&sem[1]);
}
}
void f_read(void) //线程2的调用函数,用于读管道4(即接收客户2发的消息)
{
int fd4 = open("/tmp/FIFO4", O_RDWR);
if(0 > fd4)
{
printf("open4:%s\n",strerror(fd4));
exit(-1);
}
char buf[SIZE] = {0};
while(1)
{
//sem_wait(&sem[1]);
read(fd4, buf, sizeof(buf));
printf(":");
puts(buf);
memset(buf, 0, sizeof(buf));
//sem_post(&sem[0]);
}
}
________quest2.c_________
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <pthread.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#define SIZE 1024
sem_t sem[2];
pthread_t pid[2];
void f_write(void );
void f_read(void );
int main()
{
if(0 >sem_init(&sem[0], 0, 1))
{
perror("sem_init0");
exit(-1);
}
if(0 >sem_init(&sem[1], 0, 0))
{
perror("sem_init1");
exit(-1);
}
int ret1 = pthread_create(&pid[0], NULL, (void *)f_write, NULL); //客户2的第一个线程
if(0 > ret1)
{
printf("pthread_create0:%s",strerror(ret1));
exit(-1);
}
int ret2 = pthread_create(&pid[1], NULL, (void *)f_read, NULL); //客服2的第二个线程
if(0 > ret2)
{
printf("pthread_create0:%s",strerror(ret2));
exit(-1);
}
pthread_join(pid[0], NULL); //等待线程1
pthread_join(pid[1], NULL);//等待线程2
return 0;
}
void f_write(void) //线程1调用函数,用于写管道3(即客户2给客户1发消息)
{
int fd3 = open("/tmp/FIFO3", O_RDWR);
if(0 > fd3)
{
printf("open3:%s\n",strerror(fd3));
exit(-1);
}
char buf[SIZE] = {0};
while(1)
{
//sem_wait(&sem[0]);
printf("Enter a string:\n");
fgets(buf, sizeof(buf)-1,stdin);
write(fd3, buf, sizeof(buf)-1);
//sem_post(&sem[1]);
}
}
void f_read(void) // 线程2调用的函数,用于读管道2(即接收客户1发的消息)
{
int fd2 = open("/tmp/FIFO2", O_RDWR);
if(0 > fd2)
{
printf("open2:%s\n",strerror(fd2));
exit(-1);
}
char buf[SIZE] = {0};
while(1)
{
//sem_wait(&sem[1]);
read(fd2, buf, sizeof(buf));
printf(":");
puts(buf);
memset(buf, 0, sizeof(buf));
//sem_post(&sem[0]);
}
}
各位大哥不好意思,昨天写完就很晚了,所以就没说明就发上来了,由于初学逻辑上肯定没把握好,所以显得有点乱,请各位谅解!我会进步的。我想请教的是线程之间的同步互斥问题,我也看了书了,还是不怎么明白,怎么用信号灯或互斥锁解决这问题,还有就是函数回调问题?望指点小弟,谢谢各位!
[ 本帖最后由 遗矢的老人 于 2012-8-16 18:58 编辑 ]