确定read()和fork()系统调用的可能输出

时间:2018-12-16 19:29:41

标签: c file process fork system-calls

我在测试审查中遇到问题,要求我找到此代码段的五个可能输出。

mydata.txt包含“ 1234567890”。

我一直在努力围绕正在发生的序列,但是我无法在脑海中产生具体的答案。

此外,我必须解释1423是否是可能的输出,并解释原因。

到目前为止,我发现的是,由于fork()在打开之后发生,因此父进程和子进程共享相同的文件描述符。

但是我无法弄清楚所有可能的输出,并解释为什么1423无法实现。我希望这里有人可以帮助我。

{{1}}

1 个答案:

答案 0 :(得分:0)

fork()之后,您有两个名为AB的进程执行以下操作:

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,依此类推。

我们可以看到,进程将始终从文件中读取递增的数字。有可能性:

  • a)第一个进程将读取12,然后第二个进程将读取34
  • b)第一个过程将读取1,然后第二个过程将读取2,然后第一个过程将读取3,然后第二个过程将读取4
  • c)第一个进程可以读取1,然后第二个进程可以读取23,然后第一个进程可以读取4

“第一个进程”和“第二个进程”不是进程AB,没关系,它是获得CPU时间的第一个进程。这两个进程中的printf也可以按任何顺序运行。现在我们可以将所有可能的输出为:

  • a)1)1234
  • a)2)3412
  • b)1)1324
  • b)2)2413
  • c)1)1423
  • c)2)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