5月 30
  1. [root@localhost 2]# ./a
  2. pid: 4144 fork: 0
  3. pid: 4143 fork: 4144
  4. [root@localhost 2]# cat a.c
下载: a.c
  1.  #include <stdlib.h>
  2.  #include <stdio.h>
  3.  
  4.  main() {
  5.     int pid;
  6.  
  7.     switch ( pid = fork() ){
  8.        case -1:
  9.           printf("fork: error");
  10.           break;
  11.  
  12.        case 0:         /* child */
  13.           printf ("pid: %d fork: %d\n", getpid(), pid);
  14.           break;
  15.  
  16.        default:        /* parent */
  17.           printf("pid: %d fork: %d\n", getpid(), pid );
  18.           break;
  19.  
  20.     }
  21.     exit(0);
  22.  }

网上有些文章简单的说成fork调用一次,返回两次.

我的理解是fork调用以后,会创建一个新的子进程,将父进程(4143)的环境(fork调用之前的所有变量)复制(是复制!!!)到子进程(4144)中.这样,运行到fork函数的时候,我们就得到了2个进程(4144和4143)

然后由fork函数返回该进程(也就是父进程4143)创建的子进程pid(4144)

如果没有就返回0(比如4144)

如果异常,返回-1

由于是2个进程,每个进程的fork都会返回1次,总体看上去就像返回了2次一样.根据返回值的不同,可以让2个进程执行不同的代码.

以下是TCPechod.c中fork应用的节选

  1.  switch (fork()) {
  2.     case 0:         /* child */
  3.        (void) close(msock);
  4.        exit(TCPechod(ssock));
  5.     default:        /* parent */
  6.        (void) close(ssock);
  7.        break;
  8.     case -1:
  9.        errexit("fork: %s\n", strerror(errno));
  10.  }
5月 17

以下代码摘自 Internetworking With TCP/IP Vol III (Douglas E.Comer/David L.Stevens) 第7章

int main(int argc, char *argv[])
{
  
char *host = "localhost"; /* host to use if none supplied */
  
char *service = "echo"; /* default service name */
 
  
switch (argc) {
      
case 1:
        
host = "localhost";
        
break;
      
case 3:
        
service = argv[2];
        
/* FALL THROUGH */
      
case 2:
        
host = argv[1];
        
break;
      
default:
        
fprintf(stderr, "usage: TCPecho [host [port]]\n");
        
exit(1);
  
}
  
TCPecho(host, service);
  
exit(0);
}

代码第一眼看上去有点奇怪,switch的顺序1>3>2,而且case3没有break,稍微花点时间可以看出上下文的意思就明白为什么这么做了.仔细想了一下,感觉这样做是否值得呢?

1. 对于人而言,维护这样的代码无疑增加了开销

2. 对于编译器而言,这样写于常规写法比起来,并没有提高任何性能(如循环次数,处理命令的数量等)

3. 对于读者再说,不知道其他人或者作者的习惯如何,至少我是迷糊了一会儿的….(当然,这样写比较巧妙,但这样的技巧似乎没有带来任何收益?)