#include #include #include #include #include #include #include #include #define TMP_FILE "/tmp/.ifconfig.log" int main(int argc, char **argv) { pid_t pid; int fd; char buf[1024]; int rv; char *ptr; FILE *fp; char *ip_start; char *ip_end; char ipaddr[16]; if( (fd=open(TMP_FILE, O_RDWR|O_CREAT|O_TRUNC, 0644)) < 0 ) { printf("Redirect standard output to file failure: %s\n", strerror(errno)); return -1; } pid = fork(); if(pid < 0) { printf("fork() create child process failure: %s\n", strerror(errno)); return -1; } else if( pid == 0 ) { printf("Child process start excute ifconfig program\n"); dup2(fd, STDOUT_FILENO); execl("/sbin/ifconfig", "ifconfig", "eth0", NULL); printf("Child process start excute ifconfig program over\n"); return 0; } else { sleep(3); } memset(buf, 0, sizeof(buf)); rv=read(fd, buf, sizeof(buf)); printf("Read %d bytes data dierectly read after child process write\n", rv); lseek(fd, 0, SEEK_SET); rv=read(fd, buf, sizeof(buf)); printf("Read %d bytes data after lseek:\n %s\n ", rv, buf); fp = fdopen(fd, "r"); fseek(fp, 0, SEEK_SET); memset(buf, 0, sizeof(buf)); rv=read(fd, buf, sizeof(buf)); printf("Read %d bytes data dierectly read after child process write\n", rv); printf("Read %d bytes data dierectly read after child process write\n", rv); lseek(fd, 0, SEEK_SET); rv=read(fd, buf, sizeof(buf)); printf("Read %d bytes data after lseek:\n %s\n ", rv, buf); fp = fdopen(fd, "r"); fseek(fp, 0, SEEK_SET); while( fgets(buf, sizeof(buf), fp) ) { if( strstr(buf, "netmask") ) { ptr=strstr(buf, "inet"); if( !ptr ) { break; } ptr += strlen("inet"); while( isblank(*ptr) ) ptr++; ip_start = ptr; while( !isblank(*ptr) ) ptr++; ip_end = ptr; memset(ipaddr, 0, sizeof(ipaddr)); memcpy(ipaddr, ip_start, ip_end-ip_start); break; } } printf("Parser and get IP address: %s\n", ipaddr); fclose(fp); unlink(TMP_FILE); return 0; }