在阅读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的分支中去,导致出现这样的结果