APUE Learning Example Source Code
guowenxue
2020-04-29 b8fb7f30f9d42d69bf25734bf0ee351809e62198
ch3_fork/fork_var.c
@@ -1,109 +1,40 @@
#include <stdio.h>
#include <errno.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)
int  g_var = 6;
char g_buf[]="A string write to stdout.\n";
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];
        int     var = 88;
        pid_t   pid;
        if( (fd=open(TMP_FILE, O_RDWR|O_CREAT|O_TRUNC, 0644)) < 0 )
        if( write(STDOUT_FILENO, g_buf, sizeof(g_buf)-1) < 0)
        {
                printf("Redirect standard output to file failure: %s\n", strerror(errno));
                printf("Write string to stdout error: %s\n", strerror(errno));
                return -1;
        }
        pid = fork();
        if(pid < 0)
        printf("Befor fork\n");
        if( (pid=fork()) < 0)
        {
                printf("fork() create child process failure: %s\n", strerror(errno));
                return -1;
                printf("fork() error: %s\n", strerror(errno));
                return -2;
        }
        else if( pid == 0 )
        else if( 0 == pid)
        {
                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;
                printf("Child process  PID[%d] running...\n", getpid());
                g_var ++;
                var ++;
        }
         else
        else
        {
                sleep(3);
                printf("Parent process PID[%d] waiting...\n", getpid());
                sleep(1);
        }
        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);
        printf("PID=%ld, g_var=%d, var=%d\n", (long) getpid(), g_var, var);
        return 0;
}