Unix/Linux编程实践教程(三:代码、测试)
测试logfilec.c的时候,有个sendto(sock,msg,strlen(msg),0,&addr,addrlen),编译时提示:
logfilec.c:30: warning: passing argument 5 of ‘sendto’ from incompatible pointer type
但是书上是这样写的,在stackoverflow搜了一下,原来是:
需要进行一个转换。
另外才注意到C语言中单引号可转义可不转。
需要用curses库的测试hello1.c,发现没有,需要安装。
//hello1.c #include<stdio.h> #include<curses.h> #include<stdlib.h> main() { initscr(); clear(); move(10,20); addstr("hello,world"); move(LINES-1,0); refresh(); getch(); endwin(); }
按照yum的安装,安装失败,yum命令无法成功运行。还是不能成功编译hello1.c。
后来网上看才发现CentOS已经默认安装curses,只是编译时需链接库:
gcc hello1.c -o hello1 -lcurses
测试bounce1d.c时,提示:
undefined reference to `set_ticker'
原来set_ticker这个函数并不包含在库里面,需要自己编写。
//bounce1d.c #include<stdio.h> #include<curses.h> #include<sys/time.h> #include<signal.h> #include<string.h> #define MESSAGE "hello" #define BLANK " " int row; int col; int dir; int main() { int delay; int ndelay; int c; void move_msg(int); int set_ticker(long); initscr(); crmode(); noecho(); clear(); row=20; col=0; dir=1; delay=200; move(row,col); addstr(MESSAGE); signal(SIGALRM,move_msg); set_ticker(delay); while(1) { ndelay=0; c=getch(); if(c=='q') break; if(c==' ') dir=-dir; if(c=='f'&&delay>2) ndelay=delay/2; if(c=='s') ndelay=delay*2; if(ndelay>0) set_ticker(delay=ndelay); } endwin(); return 0; } void move_msg(int signum) { signal(SIGALRM,move_msg); move(row,col); addstr(BLANK); col+=dir; move(row,col); addstr( MESSAGE); refresh(); if(dir==-1&&col<=0) dir=1; else if(dir==1&&col+strlen(MESSAGE)>=COLS) dir=-1; } int set_ticker(long n_msecs) { struct itimerval new_timeset; long n_sec,n_usecs; n_sec=n_msecs/1000; n_usecs=(n_msecs%1000)*1000L; new_timeset.it_interval.tv_sec=n_sec; new_timeset.it_interval.tv_usec=n_usecs; new_timeset.it_value.tv_sec=n_sec; new_timeset.it_value.tv_usec=n_usecs; return setitimer(ITIMER_REAL,&new_timeset,NULL); }