首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >确定read()和fork()系统调用的可能输出

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

Stack Overflow用户
提问于 2018-12-17 03:29:41
回答 1查看 63关注 0票数 0

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

mydata.txt包含"1234567890“。

我一直试图把我的大脑包裹在正在发生的序列上,但我无法在我的大脑中创造一个具体的答案。

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

到目前为止,我弄清楚的是,因为fork()发生在open之后,所以父进程和子进程共享相同的文件描述符。

但我无法计算出所有可能的输出,并解释为什么1423是不可能的。我希望这里有人能帮助我。

代码语言:javascript
复制
int fd;
char buf[5] = "wxyz";
fd = open("mydata.txt", O_RDONLY);
fork();
read(fd, buf, 1);
read(fd, buf+1, 1);
printf("%c%c", buf[0], buf[1]);
EN

回答 1

Stack Overflow用户

发布于 2018-12-17 04:53:29

fork()之后,您有两个进程,我将其命名为AB,它们执行这些操作:

代码语言:javascript
复制
1) read(fd, buf, 1);
2) read(fd, buf+1, 1);
3) printf("%c%c", buf[0], buf[1]);

您可以编写所有可能的组合。示例组合如下:

  • A执行语句file
  • A,从文件中读取1并增加游标pos;file
  • A执行2语句,从文件中读取2并增加excites语句3中的游标pos,即。打印12
  • B从file
  • B读取3从file
  • B读取4打印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],然后第一个进程打印它的buf1,然后第二个进程打印buf1。然后,您将获得更多的组合,因为基本上语句printf("%c%c", buf[0], buf[1])变为两个语句printf("%c", buf[0])printf("%c", buf[1]),这两个语句在每个进程中相继执行,但这两个进程都可以以任何顺序运行它们。

输出1423是可能的,如果其中一个进程从文件中读取1,那么另一个进程从文件中读取23,然后其中一个进程读取4并打印14,然后另一个进程打印23

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53805738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档