#P1680. Fork() Makes Trouble

Fork() Makes Trouble

考虑在Redhat 9.0系统下运行的以下C程序:

1  #include <stdio.h>
2  #include <unistd.h>
3  #include <sys/wait.h>
4  #define N ???
5  int main(void)
6  {
7     int i;
8     int ProcessID;
9     int A;
10    A = 0;
11    for (i = 0; i < N; i++)
12    {
13       printf("Loop %d: Process ID=%d\n", i, getpid());
14       A = A + 7;
15       while ((ProcessID = fork()) == -1);
16       if (ProcessID == 0)
17       {
18           printf("Process ID=%d, A=%d\n", getpid(), A);
19       }
20       else
21       {
22           wait(NULL);
23       }
24    }
25  }

第15行的fork()函数会创建当前进程的一个副本,向父进程返回子进程的PID,向子进程返回0。调用fork()后,子进程会在第18行打印一条消息,然后继续下一次循环;而父进程会在第22行等待子进程结束。注意,一旦完成fork(),父进程和子进程就是相互独立的(即拥有各自的局部变量),并且并行执行(但在本程序中,由于父进程在调用fork()后会立即等待子进程终止,因此通常只有一个进程在运行)。

你需要输出程序输出的第i行。假设初始进程的PID为1000,新创建进程的PID按1递增。

输入

第一行是一个整数t(1 ≤ t ≤ 20),表示测试用例的数量。接下来的每行包含两个整数n和i(1 ≤ n ≤ 15),分别表示第4行中N的值和需要输出的行数。

输出

对于每个输入,输出程序输出的第i行。保证第i行一定存在。

输入数据示例

3
4 1
4 6
4 19

输出数据示例

Loop 0: Process ID=1000
Process ID=1003, A=21
Loop 2: Process ID=1009

提示

当n=4时,程序的完整输出如下:

Loop 0: Process ID=1000
Process ID=1001, A=7
Loop 1: Process ID=1001
Process ID=1002, A=14
Loop 2: Process ID=1002
Process ID=1003, A=21
Loop 3: Process ID=1003
Process ID=1004, A=28
Loop 3: Process ID=1002
Process ID=1005, A=28
Loop 2: Process ID=1001
Process ID=1006, A=21
Loop 3: Process ID=1006
Process ID=1007, A=28
Loop 3: Process ID=1001
Process ID=1008, A=28
Loop 1: Process ID=1000
Process ID=1009, A=14
Loop 2: Process ID=1009
Process ID=1010, A=21
Loop 3: Process ID=1010
Process ID=1011, A=28
Loop 3: Process ID=1009
Process ID=1012, A=28
Loop 2: Process ID=1000
Process ID=1013, A=21
Loop 3: Process ID=1013
Process ID=1014, A=28
Loop 3: Process ID=1000
Process ID=1015, A=28