免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9959 | 回复: 9
打印 上一主题 下一主题

fcntl(myfd,F_SETFL,0)中的'0'指的是什么?是只读? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-11-13 18:54 |只看该作者 |倒序浏览
/*部分代码*/
  connect (Client_sock, (struct sockaddr *) &hlr_addr,sizeof (struct sockaddr)
);

  t_wait.tv_sec = 5;
  t_wait.tv_usec = 0;
  FD_ZERO(&wset);
  FD_SET(Client_sock,&wset);
  select(Client_sock+1,NULL,&wset,NULL,&t_wait);
  if(!FD_ISSET(Client_sock,&wset)){
   printf("Connect HLR error!\n";
   close(Client_sock);
   return;
  }
  if(fcntl(Client_sock,F_SETFL,0) < 0 ) /*就这一句*/
    return ;

论坛徽章:
0
2 [报告]
发表于 2004-11-13 20:15 |只看该作者

fcntl(myfd,F_SETFL,0)中的'0'指的是什么?是只读?

将第一个参数描述符引用的文件设置为只读

论坛徽章:
0
3 [报告]
发表于 2004-11-13 21:11 |只看该作者

fcntl(myfd,F_SETFL,0)中的'0'指的是什么?是只读?

8过,这样使用的用意是擦除以前设置的标志(不包括O_RDONLY,O_WRONLY和O_RDWR).当然也可以把0换成1或者2

论坛徽章:
0
4 [报告]
发表于 2004-11-13 21:54 |只看该作者

fcntl(myfd,F_SETFL,0)中的'0'指的是什么?是只读?

设成只读是为了什么?

论坛徽章:
0
5 [报告]
发表于 2004-11-13 21:58 |只看该作者

fcntl(myfd,F_SETFL,0)中的'0'指的是什么?是只读?

[quote]原帖由 "WeiUnixOracle"]设成只读是为了什么?[/quote 发表:

晕,上面说过了爱
擦除曾设置过的标志位

论坛徽章:
0
6 [报告]
发表于 2004-11-13 22:07 |只看该作者

fcntl(myfd,F_SETFL,0)中的'0'指的是什么?是只读?

void call_thread_func(){
   struct sockaddr_in hlr_addr;
   struct timeval t_wait;      
   fd_set readfds,wset;
   RcmhgQryUserAck_T UserInfo;
   char recvBuf[1100],sendBuf[1100],UserNumber[21];
   int num_one_recv,num_recv,ret,i;
   num_recv=0;
   num_one_recv=0;
   memset(recvBuf,0,1100);
   while(num_recv<31){
     t_wait.tv_sec = 5;
     t_wait.tv_usec =0;
     FD_ZERO(&readfds);
     FD_SET(Server_sock, &readfds);
     select(Server_sock+1, &readfds, NULL, NULL, &t_wait);
     if (!FD_ISSET(Server_sock, &readfds)|| (num_one_recv =recv (Server_sock, recvBuf+num_recv ,64,0))<=0){
       printf("Receive call error!\n";
       close(Server_sock);
       close(Client_sock);
       return;
     }
     num_recv+=num_one_recv;
  }
  printf("\nRecv Call buf is\n";
  for(i=0;i<num_recv;i++)
    printf("%-3d,",recvBuf);
  memcpy(UserNumber,recvBuf+18,20);

if ((Client_sock = socket (AF_INET, SOCK_STREAM, 0)) == -1)
    {
      printf("Create Socket Error!\n";
      close(Client_sock);
      return;
    }
  hlr_addr.sin_family = AF_INET;
  hlr_addr.sin_port = htons (HLR_PORT);
  hlr_addr.sin_addr.s_addr = inet_addr (HLR_ADDR);
  memset (&(hlr_addr.sin_zero), 0, ;

  if(fcntl(Client_sock,F_SETFL,O_NONBLOCK) < 0 )
      return ;
  connect (Client_sock, (struct sockaddr *) &hlr_addr,sizeof (struct sockaddr)
);

  t_wait.tv_sec = 5;
  t_wait.tv_usec = 0;
  FD_ZERO(&wset);
  FD_SET(Client_sock,&wset);
  select(Client_sock+1,NULL,&wset,NULL,&t_wait);
  if(!FD_ISSET(Client_sock,&wset)){
   printf("Connect HLR error!\n";
   close(Client_sock);
   return;
  }
  if(fcntl(Client_sock,F_SETFL,0) < 0 )
    return ;
  printf("connect HLR  OK!\n";
  ret=RcmhgQryUser(UserNumber,&UserInfo);
  if(ret==0)
    ret=RcmhgModUser(UserNumber,&UserInfo);
  memcpy(sendBuf,recvBuf,1;
  memset(sendBuf+18,ret,1);
  if(send(Server_sock,sendBuf,19,0)<19){
      printf("Send resp error!\n";
      close(Client_sock);
      close(Server_sock);
      return;
  }
  if(ret!=0)
    close(Client_sock);
  close(Server_sock);
      
}
现在程序老有挂死的现象,想改动一下.

论坛徽章:
0
7 [报告]
发表于 2004-11-13 22:18 |只看该作者

fcntl(myfd,F_SETFL,0)中的'0'指的是什么?是只读?

原帖由 "WeiUnixOracle" 发表:
void call_thread_func(){
struct sockaddr_in hlr_addr;
struct timeval t_wait;
fd_set readfds,wset;
RcmhgQryUserAck_T UserInfo;
char recvBuf[1100],sendBuf[1100],UserNumber[21];
int num_one_recv,num_recv,ret,i;
num_recv=0;
num_one_recv=0;
memset(recvBuf,0,1100);
while(num_recv<31){
t_wait.tv_sec = 5;
t_wait.tv_usec =0;
FD_ZERO(&readfds);
FD_SET(Server_sock, &readfds);
select(Server_sock+1, &readfds, NULL, NULL, &t_wait);
if (!FD_ISSET(Server_sock, &readfds)|| (num_one_recv =recv (Server_sock, recvBuf+num_recv ,64,0))<=0){
printf("Receive call error!\n";
close(Server_sock);
close(Client_sock);
return;
}
num_recv+=num_one_recv;
}
printf("\nRecv Call buf is\n";
for(i=0;i<num_recv;i++)
printf("%-3d,",recvBuf);
memcpy(UserNumber,recvBuf+18,20);

if ((Client_sock = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
printf("Create Socket Error!\n";
close(Client_sock);
return;
}
hlr_addr.sin_family = AF_INET;
hlr_addr.sin_port = htons (HLR_PORT);
hlr_addr.sin_addr.s_addr = inet_addr (HLR_ADDR);
memset (&(hlr_addr.sin_zero), 0, icon_cool.gif;

if(fcntl(Client_sock,F_SETFL,O_NONBLOCK) < 0 )
return ;

connect (Client_sock, (struct sockaddr *) &hlr_addr,sizeof (struct sockaddr)
);

t_wait.tv_sec = 5;
t_wait.tv_usec = 0;
FD_ZERO(&wset);
FD_SET(Client_sock,&wset);
select(Client_sock+1,NULL,&wset,NULL,&t_wait);
if(!FD_ISSET(Client_sock,&wset)){
printf("Connect HLR error!\n";
close(Client_sock);
return;
}
if(fcntl(Client_sock,F_SETFL,0) < 0 )
return ;

printf("connect HLR OK!\n";
ret=RcmhgQryUser(UserNumber,&UserInfo);
if(ret==0)
ret=RcmhgModUser(UserNumber,&UserInfo);
memcpy(sendBuf,recvBuf,1icon_cool.gif;
memset(sendBuf+18,ret,1);
if(send(Server_sock,sendBuf,19,0)<19){
printf("Send resp error!\n";
close(Client_sock);
close(Server_sock);
return;
}
if(ret!=0)
close(Client_sock);
close(Server_sock);

}
现在程序老有挂死的现象,想改动一下.

看见红色的代码了?
上面两行设置O_NONBLOCK
下面的清除O_NONBLOCK

论坛徽章:
0
8 [报告]
发表于 2004-11-13 22:24 |只看该作者

fcntl(myfd,F_SETFL,0)中的'0'指的是什么?是只读?

好象设成非阻塞后再设成只读还是保非阻塞呀即只读非阻塞???  看来unix下编程还真难.

论坛徽章:
0
9 [报告]
发表于 2004-11-13 22:29 |只看该作者

fcntl(myfd,F_SETFL,0)中的'0'指的是什么?是只读?

晕,不是设置只读.设置只读是一个字面意思.表面是设置只读其实是恢复默认标志位

论坛徽章:
0
10 [报告]
发表于 2004-11-13 22:32 |只看该作者

fcntl(myfd,F_SETFL,0)中的'0'指的是什么?是只读?

[quote]原帖由 "WeiUnixOracle"]好象设成非阻塞后再设成只读还是保非阻塞呀即只读非阻塞???  看来unix下编程还真难.[/quote 发表:

把非阻塞标志擦掉了
就成了阻塞了.
你的代码中设置非阻塞标志是为了不在connect上阻塞.目的是控制select控制connect的时间,后面清除调非阻塞标志,继续使用阻塞方式读或者写
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP