我在测试审查中遇到问题,要求我找到此代码段的五个可能输出。
mydata.txt包含“ 1234567890”。
我一直在努力围绕正在发生的序列,但是我无法在脑海中产生具体的答案。
此外,我必须解释1423是否是可能的输出,并解释原因。
到目前为止,我发现的是,由于fork()在打开之后发生,因此父进程和子进程共享相同的文件描述符。
但是我无法弄清楚所有可能的输出,并解释为什么1423无法实现。我希望这里有人可以帮助我。
{{1}}
答案 0 :(得分:0)
在fork()
之后,您有两个名为A
和B
的进程执行以下操作:
1) read(fd, buf, 1);
2) read(fd, buf+1, 1);
3) printf("%c%c", buf[0], buf[1]);
您可以编写所有可能的组合。组合示例为:
A
执行语句1
,因此从文件中读取1
并增加文件中的光标pos A
执行语句2
,因此从文件中读取2
并增加文件中的光标pos A
激发语句3
,即。打印12
B
从文件中读取3
B
从文件中读取4
B
打印34
。以此类推。这些语句可以按任何顺序执行,因此首先读取先处理B
,然后首先读取A
,然后再处理B
,依此类推。
我们可以看到,进程将始终从文件中读取递增的数字。有可能性:
12
,然后第二个进程将读取34
。 1
,然后第二个过程将读取2
,然后第一个过程将读取3
,然后第二个过程将读取4
1
,然后第二个进程可以读取23
,然后第一个进程可以读取4
“第一个进程”和“第二个进程”不是进程A
或B
,没关系,它是获得CPU时间的第一个进程。这两个进程中的printf
也可以按任何顺序运行。现在我们可以将所有可能的输出为:
1234
3412
1324
2413
1423
2314
我假设进程的输出已完全缓冲,因此进程要么写入printf("%c%c", buf[0], buf[1]);
的完整输出,要么不写入。如果未缓冲输出,则例如,一个进程可以打印printf("%c", buf[0])
,然后第二个进程可以打印它的buf[0]
,然后第一个进程将打印它的buf [1],然后第二个进程的buf [1]。然后,您将获得更多组合,因为基本上printf("%c%c", buf[0], buf[1])
语句变为两个语句printf("%c", buf[0])
和printf("%c", buf[1])
,它们在每个进程中一个接一个地执行,但是两个进程都可以按任何顺序运行
输出1423
是可能的,如果其中一个进程从文件中读取1
,则另一个进程从文件中读取23
,然后其中一个进程读取{{ 1}}并打印4
,然后其他打印14
。