Update fork_var.c source code
| | |
| | | #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 g_var = 6; |
| | | char g_buf[]="A string write to stdout.\n"; |
| | | int main(int argc, char **argv) |
| | | { |
| | | int var = 88; |
| | | 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 ) |
| | | 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 |
| | | { |
| | | 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; |
| | | } |