#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