#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; }