当前位置: 技术问答>linux和unix
为什么printf函数没有打印出信息?
来源: 互联网 发布时间:2016-05-14
本文导语: 我使用FreeBSD,调用signal函数 signal(SIGHUP,sig_hup); signal(SIGIO,sig_io); 然后调用如下代码,发现程序可以执行,但是出现一个奇怪的问题,printf函数失效了!例如printf("execute main()")应打印出execute main(),但是却什么也没有打...
我使用FreeBSD,调用signal函数
signal(SIGHUP,sig_hup);
signal(SIGIO,sig_io);
然后调用如下代码,发现程序可以执行,但是出现一个奇怪的问题,printf函数失效了!例如printf("execute main()")应打印出execute main(),但是却什么也没有打印出来!为什么printf函数不起作用?
代码如下:
signal(SIGHUP,sig_hup);
signal(SIGIO,sig_io);
然后调用如下代码,发现程序可以执行,但是出现一个奇怪的问题,printf函数失效了!例如printf("execute main()")应打印出execute main(),但是却什么也没有打印出来!为什么printf函数不起作用?
代码如下:
#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)
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(lendg_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