当前位置:  技术问答>linux和unix

高手帮下忙 这事怎么回事啊 在线等

    来源: 互联网  发布时间:2016-04-03

    本文导语:  #include #include #include #include #include #include #include #include #include #include #include #include #define BUFFER_SIZE 1000 #define SER_PORT 3999 struct send_data_buffer { char buffer[BUFFER_SIZE]; pthread_mutex_t lock; pthread_cond_t send_data_able; pthread_con...

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define BUFFER_SIZE 1000
#define SER_PORT 3999

struct send_data_buffer
{
char buffer[BUFFER_SIZE];
pthread_mutex_t lock;
pthread_cond_t send_data_able;
pthread_cond_t write_data_able;
int buffer_full;
};

struct receive_data_buffer
{
char buffer[BUFFER_SIZE];
pthread_mutex_t lock;
pthread_cond_t receive_data_able;
pthread_cond_t read_data_able;
int buffer_empty;
};

char ser_IP[]={"192.168.0.115"};
struct send_data_buffer *send_buffer;
struct receive_data_buffer *receive_buffer;

void send_buffer_init(struct send_data_buffer *b)
{
pthread_mutex_init(&b->lock,NULL);
pthread_cond_init(&b->send_data_able,NULL);
pthread_cond_init(&b->write_data_able,NULL);
b->buffer_full=0;
}

void receive_buffer_init(struct receive_data_buffer *b)
{
pthread_mutex_init(&b->lock,NULL);
pthread_cond_init(&b->receive_data_able,NULL);
pthread_cond_init(&b->read_data_able,NULL);
b->buffer_empty=1;
}

void *transmission(void *data)
{
 pid_t child3,child4;
 int sockfd, numbytes,status; 
 char buf[BUFFER_SIZE];
 struct hostent *he;
 struct sockaddr_in ser_addr;  
  if((he=gethostbyname(ser_IP))==NULL)
 { 
  herror("gethostbyname error"); 
  exit(1); 
 }
 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
 { 
  perror("socket create error"); 
  //return; 
 }
 ser_addr.sin_family = AF_INET; 
 ser_addr.sin_port = htons(SER_PORT); 
 ser_addr.sin_addr = *((struct in_addr *)he->h_addr); 
 bzero(&(ser_addr.sin_zero),8); 
 printf("Start connectionn");
 if (connect(sockfd, (struct sockaddr *)&ser_addr, sizeof(struct sockaddr)) == -1)
 {
  perror("connect error"); 
  //return;
 }
 printf("connection has succedn");
 
 if(!(child3=fork()))
  {
  printf("process 1 in transmission starts!n");
  int len;
  while(1)
  {
 printf("client send start");
  pthread_mutex_lock(&send_buffer->lock);

while(send_buffer->buffer_full==0)
{
  pthread_cond_wait(&send_buffer->send_data_able,&send_buffer->lock);
}

printf("client send");
  if (send(sockfd,send_buffer->buffer,strlen(send_buffer->buffer),0) == -1)
   {
    perror("send error"); 
//return;
   }
 printf("client sending  data has succedn ");
send_buffer->buffer_full=0;
printf("the buffer_full is %d after sending data!n",send_buffer->buffer_full);
pthread_cond_signal(&send_buffer->write_data_able);
pthread_mutex_unlock(&send_buffer->lock);
  }
//exit(0);
  }
 printf("transmission is running!n");
 if(!(child4=fork()))
  {
  printf("process 2 in transmission starts");
  char buf[BUFFER_SIZE];
  while(1)
  {
 if (( numbytes = recv(sockfd, buf, BUFFER_SIZE, 0)) == -1||numbytes==0)
 { 
  perror("recv error"); 
 }
 buf[numbytes] = '';
 pthread_mutex_lock(&receive_buffer->lock);
 while(receive_buffer->buffer_empty==0)
  {
 pthread_cond_wait(&receive_buffer->receive_data_able,&receive_buffer->lock);
  }
printf("client receive");
 strcpy(receive_buffer->buffer,buf);
 receive_buffer->buffer_empty=0;
 printf("the buffer_empty is %d after receiving  data!n ",receive_buffer->buffer_empty);
 pthread_cond_signal(&receive_buffer->read_data_able);
 pthread_mutex_unlock(&receive_buffer->lock);  
}
  }
 printf("transmission is still running!n");
 waitpid(child3,&status,0);
 waitpid(child4,&status,0);
 printf("all over!^_^n");
 close(sockfd);
// return; 
}


void *infor_format(void *data)
{
pid_t child1,child2;
int status;
if(!(child1=fork()))
{
printf("process 1 in infor_format starts!n");
char buf[BUFFER_SIZE]; 
while(1)
{
printf("输入要发送的数据:n");
gets(buf);
//buf=strcat("client send:",buf);
//buf=strcat(buf,'n');
  pthread_mutex_lock(&send_buffer->lock);
while(send_buffer->buffer_full==1)
{
  pthread_cond_wait(&send_buffer->write_data_able,&send_buffer->lock);
}
strcpy(send_buffer->buffer,buf);
send_buffer->buffer_full=1;
printf("the buffer_full is %d after writing data into send_buffer!n",send_buffer->buffer_full);
printf("buffer ");
pthread_cond_signal(&send_buffer->send_data_able);
pthread_mutex_unlock(&send_buffer->lock);
}
}
if(!(child2=fork()))
{
printf("process 2 in infor_mat starts!n");
char buf[BUFFER_SIZE];
while(1)
{
 printf("start read buffer");
 pthread_mutex_lock(&receive_buffer->lock);
 while(receive_buffer->buffer_empty==1)
  {
 pthread_cond_wait(&receive_buffer->read_data_able,&receive_buffer->lock);
  }
 
 strcpy(buf,receive_buffer->buffer);
// buf=strcat("client receive:",buf);
// buf=strcat(buf,'n');
 puts(buf);
 receive_buffer->buffer_empty=1;
 printf("the buffer_empty is %d after reading data from receive_buffer!n ",receive_buffer->buffer_empty);
 pthread_cond_signal(&receive_buffer->read_data_able);
 pthread_mutex_unlock(&receive_buffer->lock);
}
}
 waitpid(child1,&status,0);
 waitpid(child2,&status,0);
}

int main(void)
{
pthread_t th_a,th_b;
void *retval;
send_buffer=(struct send_data_buffer *)malloc(sizeof(struct send_data_buffer));
receive_buffer=(struct receive_data_buffer *)malloc(sizeof(struct receive_data_buffer));
send_buffer_init(send_buffer);
receive_buffer_init(receive_buffer);
pthread_create(&th_a,NULL,transmission,0);
pthread_create(&th_b,NULL,infor_format,0);
pthread_join(th_a,&retval);
pthread_join(th_b,&retval);
return 0;
}

以上是我写的SOCKET发送的客户端

有两个共享区 一个是发送共享区  一个是接收共享区

线程transmission 用来和客户端信息的交互
线程infor_format 用来向共享区读取或写数据

在线程transmission中又建了两个进程 分别用来发送和接受


在线程infor_format中也建了两个进程  一个是写发送共享区 一个是读接收共享区


程序编译没问题

就是运行时,运行结果为:

Start connection
connection has succed
process 1 in infor_format starts!
输入要发送的数据:
transmission is running!
transmission is still running!
process 2 in infor_mat starts!
socket test  //这是输入的数据
the buffer_full is 1 after writing data into send_buffer!
buffer 输入要发送的数据:



我向下 ,为什么线程transmission中的两个进程 没能运行起来呢 


本来也能输出

 process 1 in transmission starts!
但不能输出
printf("client send start");
我捣鼓了一下 连上面的那句都输出不了了

高手帮个忙 解释下!在线等
谢谢了 !!!!!

|
子进程是对父进程数据的copy 子进程对共享区的访问并不是父进程的共享区内存   而是其COPY的数据共享区

    
 
 

您可能感兴趣的文章:

  • xawtv没图像是怎么回事?高手请进
  • 哪位高手能替兄弟解释一下,Struts是怎么回事?
  • 请教高手这是怎么回事?? 虚拟机上装 redhat linux
  • 各位高手,小弟在安装Java 2 SDK Standard Edition v1.3时出错了。是怎么回事?
  • 高手请进! linux 的下的对话框都成了??????了,怎么回事?
  • 装了redhat9,windows2000启动特别慢,怎么回事,请高手指教。
  • linux 启动错误,高手看看怎么回事~~谢
  • 请高手指点,如下错误是怎么回事?
  • red hat linux与windows 2000 server相连,2000 关机后linux自动启动!问高手怎么回事?
  • 这个错误是怎末回事?Java高手帮忙看看
  • linux编译的内核不能启动,是怎么回事,请高手指教!
  • linux安装php安装不了,请问高手这是什么回事?在线等回复,回复的都有高分!!!
  • 请问刚安装好JDK后,在任何目录下可使用JAVA,但不能使用JAVAC,JAVAH等是怎么回事?(请高手帮忙,分数20))
  • 使用redhat6.2的问题!!安装成功,却进不去??这是怎么回事,高手请进!
  • Invalid character in input这是在那么回事啊,急切啊,高手请进
  • 哪位部署过j2ee的高手知道这是怎麽回事?javax.naming.NoInitialContextException:Need to...
  • 在linux下安装oracle时,使用sysctl检查系统参数时出现许多error信息,不知道怎么回事,望高手指点!
  • 高手们:帮我看看这是怎么回事吧。调用EJB。
  • 高手帮下忙 运行时段错误怎么回事
  • 装linux遇到问题,有高手在线帮忙吗?请发信息给我
  • unix无法启动 在线等高手帮忙
  • 在线等高手,linux的rcp命令源码在那个包里啊。
  • 逻辑地址、物理地址、线性空间、全局段、局部段 问题请教,高手指教了!!!!在线等,高手指教了!!!在线等!!!!!!!!
  • 不小心远程注销了linux,然后再进去时桌面不见?急!!在线等,高手帮忙啊!
  • 在线急等。。。!vm虚拟机下安装ubuntu 正在扫描磁盘... 到36%时不动了!!! 高手指点
  • 在线等 高手近来帮忙啊!!跪求~~~~~~~~~~~~~!!5点给分 分不够从新开帖!
  • 请问高手如何在linux环境中获取bios时间,在线等待,急
  • 请问高手:web中如何把多选的select表单中的数据提交到servlet中?(在线等)
  • java开发知识 iis7站长之家
  • 请高手进入,急!在线等待
  • CSDN的诸位高手们,请问在LINUX下,用那条命令可以编译C语言的原文件,在线等待:)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 有高手研究Agent++麽?里面有个thread.h,蛮难读的,请高手指点
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由
  • 高手救命,很急——ORACLE817安装在UNIXWARE711上,手工启动数据库后在netasst中连接错误,高手帮我看看?
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 各个高手看看这个问题!本人第一次学习java所以要各位高手的帮助。。
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 我是新手,高手,高手,快来救我
  • EJB问题,请教高手(非高手莫进)
  • 请各位JAVA高手,网业高手看过来,我把能给的分都送出!!!只能给37分,哎!!
  • eWEEK沙龙征集高手座谈


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3