在閱讀APUE的時候,試着在Cygwin中測試一個源程序,如下
1 #include <stdio.h>
2 #include <string.h>
3 #include <sys/wait.h>
4 #include <unistd.h>
5
6 #define MAXLINE 512
7 static void sig_int( int );
8 int main ( int argc, char *argv[] )
9 {
10 char buf[MAXLINE] = {0};
11 pid_t pid = -1;
12 int status = -1;
13
14 if ( signal(SIGINT, sig_int) == SIG_ERR )
15 {
16 printf("SIGNAL error!\n");
17 return 128;
18 }
19
20 printf( "%% " );
21 while( 1 )
22 {
23 fgets( buf, sizeof(buf), stdin );
24 if ( strlen(buf) == 0 )
25 {
26 printf("輸入失敗!\n");
27 return 129;
28 }
29 if ( buf[strlen(buf) - 1] == '\n' )
30 {
31 buf[strlen(buf) - 1] = 0;
32 }
33
34 if ( pid = fork() == -1 )
35 {
36 printf("fork error\n");
37 return 127;
38 }
39 else if ( pid == 0 ) /*child*/
40 {
41 execlp( buf, buf, (char*)0 );
42 printf("execlp error !\n");
43 return 126;
44 }
45
46 if ( (pid = waitpid(pid, &status, 0)) < 0 )
47 {
48 printf("waitpid error!\n");
49 return 125;
50 }
51
52 printf("%% ");
53
54 }
55 }
56
57 void sig_int(int inter )
58 {
59 if (inter == SIGINT )
60 {
61 printf("hello sigint\n");
62 }
63 }
紅色字體的地方明顯出錯了,在運行後得到的結果如下:
$ ./a.exe
% date
Tue May 26 10:22:16 2015
Tue May 26 10:22:17 2015
在fork後,父子進程都會返回一個pid,然而在我的代碼中,將pid = (fork() == -1),由於在父子進程中fork()得到的結果如果成功的話都不可能是-1,因此pid得到的結果都是
0,從而都會進入pid == 0的分支中去,導致出現這樣的結果