why printf() don't work?

Mike Jeays mike.jeays at rogers.com
Mon Jan 5 05:45:53 PST 2009


On January 5, 2009 02:29:23 am Edward King wrote:
> I use FreeBSD7.0,and use signal,like follows:
> signal(SIGHUP,sig_hup);
> signal(SIGIO,sig_io);
>
> when I run call following code,it can run,but I find a puzzled question,it
> should print some information,such as printf("execute main()") will print
> execute main(),but in fact,printf fuction print none!!! Why printf function
> do not go work?
>
> my code is follows:
>
> #include "sys/ioctl.h"
> #include "unp.h"
> static int sockfd;
> #define QSIZE 8
> #define MAXDG 4096
> typedef struct{
>   void *dg_data;
>   size_t dg_len;
>   struct sockaddr *dg_sa;
>   socklen_t dg_salen;
> }DG;
> static DG dg[QSIZE];
> static long cntread[QSIZE+1];
> static int iget;
> static int iput;
> static int nqueue;
> static socklen_t clilen;
> static void sig_io(int);
> static void sig_hup(int);
>
> int main(int argc,char **argv){
>   printf("execute main()");
>   int sockfd;
>   struct sockaddr_in servaddr,cliaddr;
>   sockfd=socket(AF_INET,SOCK_DGRAM,0);
>   bzero(&servaddr,sizeof(servaddr));
>   servaddr.sin_family=AF_INET;
>   servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
>   servaddr.sin_port=htons(SERV_PORT);
>   bind(sockfd,(SA *)&servaddr,sizeof(servaddr));
>   dg_echo(sockfd,(SA *)&cliaddr,sizeof(cliaddr));
> }
> void dg_echo(int sockfd_arg,SA *pcliaddr,socklen_t clilen_arg){
>   printf("called dg_echo");
>   int i;
>   const int on=1;
>   sigset_t zeromask,newmask,oldmask;
>   sockfd=sockfd_arg;
>   clilen=clilen_arg;
>   for(i=0;i<QSIZE;i++){
>      dg[i].dg_data=malloc(MAXDG);
>      dg[i].dg_sa=malloc(clilen);
>      dg[i].dg_salen=clilen;
>   }
>   iget=iput=nqueue=0;
>   signal(SIGHUP,sig_hup);
>   signal(SIGIO,sig_io);
>   fcntl(sockfd,F_SETOWN,getpid());
>   ioctl(sockfd,FIOASYNC,&on);
>   ioctl(sockfd,FIONBIO,&on);
>   sigemptyset(&zeromask);
>   sigemptyset(&oldmask);
>   sigemptyset(&newmask);
>   sigaddset(&newmask,SIGIO);
>   sigprocmask(SIG_BLOCK,&newmask,&oldmask);
>   for(;;){
>     while(nqueue==0)
>       sigsuspend(&zeromask);
>     sigprocmask(SIG_SETMASK,&oldmask,NULL);
>    
> sendto(sockfd,dg[iget].dg_data,dg[iget].dg_len,0,dg[iget].dg_sa,dg[iget].dg
>_salen); if(++iget>=QSIZE)
>         iget=0;
>     sigprocmask(SIG_BLOCK,&newmask,&oldmask);
>     nqueue--;
>   }
> }
> static void sig_io(int signo){
>   printf("sig_io called");
>   ssize_t len;
>   int nread;
>   DG *ptr;
>   for(nread=0;;){
>      if(nqueue>=QSIZE)
>        err_quit("receive overflow");
>      ptr=&dg[iput];
>      ptr->dg_salen=clilen;
>      len=recvfrom(sockfd,ptr->dg_data,MAXDG,0,ptr->dg_sa,&ptr->dg_salen);
>      if(len<0){
>        if(errno==EWOULDBLOCK)
>           break;
>        else
>           err_sys("recvfrom error");
>      }
>      ptr->dg_len=len;
>      nread++;
>      nqueue++;
>      if(++iput>=QSIZE)
>         iput=0;
>    }
>    cntread[nread]++;
> }
> static void sig_hup(int signo){
>   printf("sig_hup called");
>   int i;
>   for(i=0;i<=QSIZE;i++)
>     printf("cntread[%d]=%ld\n",i,cntread[i]);
> }
> ---------------------------------------------------------------------------
>------------------------ Confidentiality Notice: The information contained
> in this e-mail and any accompanying attachment(s) is intended only for the
> use of the intended recipient and may be confidential and/or privileged of
> Neusoft Corporation, its subsidiaries and/or its affiliates. If any reader
> of this communication is not the intended recipient, unauthorized use,
> forwarding, printing,  storing, disclosure or copying is strictly
> prohibited, and may be unlawful.If you have received this communication in
> error,please immediately notify the sender by return e-mail, and delete the
> original message and all copies from your system. Thank you.
> ---------------------------------------------------------------------------
>------------------------

I think you need #include <stdio.h>

-- 
Mike Jeays
http://www.jeays.ca


More information about the freebsd-questions mailing list