APUE Learning Example Source Code
Guo Wenxue
2018-12-05 bd11641d0c07695581ce372a61c7c1cd767ee132
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
 
#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 excute another program, will not return here. Return here means execl() error\n");
        return -1;
        }
        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);
 
        memset(buf, 0, sizeof(buf));
        lseek(fd, 0, SEEK_SET);
        rv=read(fd, buf, sizeof(buf));
        printf("Read %d bytes data after lseek:\n %s", 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;
}