recvfrom

#include < sys/types.h >
#include < sys/socket.h >
#include < netinet/in.h >

#include < unistd.h >
#include < stdio.h >
#include < string.h >
#include < arpa/inet.h >

int main()
{
    int sock_fd;
    struct sockaddr_in sv_addr, cl_addr;
    socklen_t cl_len;
    ssize_t n;
    char buf[4096];
    if((sock_fd = socket(PF_INET, SOCK_DGRAM, 0)) < 0){
        perror("socket");
        return 1;
    }
    
    memset(&sv_addr, 0, sizeof sv_addr);
    sv_addr.sin_family = AF_INET;
    sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    sv_addr.sin_port = htons(12345);
    
    if (bind(sock_fd, (struct sockaddr *)&sv_addr, sizeof sv_addr)<0){
        perror("bind");
        return 1;
    }
    cl_len = sizeof cl_addr;
    
    if ((n = recvfrom(sock_fd, buf, sizeof buf, 0,
                      (struct sockaddr *)&cl_addr, &cl_len)) < 0){
        perror("recvfrom");
        return 1;
    }
    fprintf(stderr, "UDP from addr = %s, port = %d\n",
            inet_ntoa(cl_addr.sin_addr),
            ntohs(cl_addr.sin_port));
    write(1, buf, n);
    return 0;
}

ホスト名を取得

#include 
#include 

int main(){
    char name[256];
    
    if(gethostname(name, sizeof name)<0){
        perror("gethostname");
        return 1;
    }
    printf("%s\n", name);
    return 0;
}

システム情報を取得

OSなどのシステム情報を取得するにはunameを使います。

#include < sys/utsname.h >

#include < stdio.h >

int main()
{
    struct utsname buf;
    
    if (uname(&buf) < 0){
        perror("uname");
        return 1;
    }
    
    printf("%s %s %s %s %s\n",
           buf.sysname,
           buf.nodename,
           buf.release,
           buf.version,
           buf.machine);
    return 0;
}

settimeofday

#include < sys/time.h >

#include < time.h >
#include < stdio.h >

int main(){
    struct timeval tv;
    struct tm tm;
    
    tm.tm_sec = 0;
    tm.tm_min = 0;
    tm.tm_hour = 0;
    tm.tm_mday = 1;
    tm.tm_mon = 0;
    tm.tm_year = 138;
    tm.tm_isdst = 0;
    tv.tv_sec = mktime(&tm);
    tv.tv_usec = 0;
    
    if (settimeofday(&tv, NULL) < 0){
        perror("settimeofday");
        return 1;
    }
    return 0;
}

現在時刻を取得

#include < sys/time.h >
#include < time.h >
#include < stdio.h >

int main()
{
    struct timeval tv;
    
    if (gettimeofday(&tv, NULL) < 0){
        perror("gettimeofday");
        return 1;
    }
    printf("%s", ctime(&tv.tv_sec));
    return 0;
}

signal

#include < signal.h >

#include < unistd.h >
#include < stdio.h >

static void
func_int()
{
    write(2, "SIGINT\n", 7);
}

int main()
{
    if (signal(SIGINT, func_int) == SIG_ERR){
        perror("signal");
        return 1;
    }
    sleep(60);
    return 0;
}

getitimer

インターバルタイマーを使って一定時間間隔でシグナルを発生。

#include < sys/time.h >

#include < signal.h >
#include < unistd.h >
#include < stdio.h >
#include < string.h >

static void
interval()
{
    write(2, ".", 1);
}

int main()
{
    struct itimerval val;
    struct sigaction act;
    sigset_t set;
    
    memset(&act, 0, sizeof act);
    act.sa_handler = interval;
    if (sigaction(SIGALRM, &act, NULL)< 0){
        perror("sigaction");
        return 1;
    }
    
    val.it_interval.tv_sec = 1;
    val.it_interval.tv_usec = 0;
    val.it_value = val.it_interval;
    if (setitimer(ITIMER_REAL, & val, NULL) < 0){
        perror("setitimer");
        return 1;
    }
    
    if (getitimer(ITIMER_REAL, &val) < 0){
        perror("getitimer");
        return 1;
    }
    printf(
    "it_interval = %ld.%ld\n"
           "it_value = %ld.%ld\n",
           val.it_interval.tv_sec, val.it_interval.tv_usec,
           val.it_value.tv_sec, val.it_value.tv_usec);
    
    sigemptyset(&set);
    for(;;){
        sigsuspend(&set);
    }
    return 0;
}

sigsuspend

シグナルの到着を待つシステムコールです。シグナルを受信するまでプロセスは停止します。

#include < signal.h >
#include < unistd.h >
#include < stdio.h >
#include < string.h >

static void func_int() {}

int main()
{
    struct sigaction act;
    sigset_t set;
    
    memset(&act, 0, sizeof act);
    act.sa_handler = func_int;
    if (sigaction(SIGINT, &act, NULL) < 0){
        perror("sigaction");
        return 1;
    }
    sigemptyset(&set);
    sigsuspend(&set);
    write(2, "SIGINT\n", 7);
    return 0;
}

sigaction

sigaction構造体をあらかじめmemset()で0クリアしてから、sa_handlerにシグナルハンドラの関数名を代入します。

#include 

#include 
#include 
#include 

static void
func_int()
{
    write(2, "SIGINT\n", 7);
}

int main()
{
    struct sigaction act;
    
    memset(&act, 0, sizeof act);
    act.sa_handler = func_int;
    if (sigaction(SIGINT,&act, NULL) < 0){
        perror("sigaction");
        return 1;
    }
    sleep(60);
    return 0;
}

シグナル送信kill

killは引数pidで指定したプロセスに、引数sigで指定したシグナルを送信します。

#include < sys/types.h >
#include < signal.h >

#include < stdio.h >
#include < stdlib.h >

int main(int argc, char *argv[])
{
    pid_t pid;
    
    pid = 0;
    if (argc >= 2){
        pid = atoi(argv[1]);
    }
    
    if (kill(pid, SIGTERM) < 0){
        perror("kill");
        return 1;
    }
    return 0;
}