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