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();
}
hello1.c

 

 

 

按照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);

}
bounce1d.c

 

posted @ 2016-09-18 18:23  IT由零开始  阅读(1452)  评论(0编辑  收藏  举报