#include < sys/types.h > #include < sys/stat.h > #include < fcntl.h > #include < unistd.h > #include < stdio.h > static int cat(int fd, char *file) { ssize_t n; char buf[4096]; while ((n = read(fd, buf, sizeof buf)) > 0){ if(write(1, buf, n) < 0){ perror("write"); return 1; } } if (n < 0){ perror(file); return 1; } return 0; } int main(int argc, char **argv) { int i; int fd; int err = 0; if (argc <= 1){ return cat(0, "stdin"); } for (i = 1; i < argc; i++){ if ((fd = open(argv[i], O_RDONLY)) < 0){ perror(argv[i]); err = 1; continue; } err != cat(fd, argv[i]); if (close(fd) < 0){ perror(argv[i]); err = 1; } } return err; }
Month: June 2016
簡易catコマンド
#include < unistd.h > #include < stdio.h > int main(){ ssize_t n; char buf[4096]; while ((n = read(0, buf, sizeof buf)) > 0){ if (write(1, buf, n)< 0){ perror("write"); return 1; } } if (n < 0){ perror("read"); return 1; } return 0; }
簡易echoコマンド
#include < unistd.h > #include < string.h > int main(int argc, char **argv) { int i; if (argc >= 2){ for (i = 1;;){ write (1, argv[i], strlen(argv[i])); if (++i >= argc){ break; } write (1, " ", 1); } } write(1, "\n", 1); return 0; }
接続先または自分のソケットアドレスを取得
#include < sys/socket.h > #include < netinet/in.h > #include < unistd.h > #include < stdio.h > #include < string.h > #include < arpa/inet.h > int main() { struct sockaddr_in sv_addr, cl_addr; socklen_t sv_len, cl_len; sv_len = sizeof sv_addr; if(getsockname(0, (struct sockaddr *)&sv_addr, &sv_len) < 0){ perror("getsockname"); return 1; } fprintf(stderr, "getsockname: addr = %s, port = %d\n", inet_ntoa(sv_addr.sin_addr), ntohs(sv_addr.sin_port)); cl_len = sizeof cl_addr; if (getpeername(0, (struct sockaddr *)&cl_addr, &cl_len)<0){ perror("getpeername"); return 1; } fprintf(stderr, "getpeername: addr = %s, port = %d\n", inet_ntoa(cl_addr.sin_addr), ntohs(cl_addr.sin_port)); write(1, "Hello\n", 6); return 0; }
sendto
#include < sys/types.h > #include < sys/socket.h > #include < netinet/in.h > #include#include int main() { int sock_fd; struct sockaddr_in sv_addr; ssize_t n; 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_LOOPBACK); sv_addr.sin_port = htons(12345); if ((n = sendto(sock_fd, "Hello\n", 6, 0, (struct sockaddr *)&sv_addr, sizeof sv_addr)) < 0){ perror("sendto"); return 1; } return 0; }
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; }