我在测试评审中遇到了一个问题,要求我找到此代码片段的五个可能的输出。
mydata.txt包含"1234567890“。
我一直试图把我的大脑包裹在正在发生的序列上,但我无法在我的大脑中创造一个具体的答案。
此外,我必须解释1423是否是可能的输出,并解释原因。
到目前为止,我弄清楚的是,因为fork()发生在open之后,所以父进程和子进程共享相同的文件描述符。
但我无法计算出所有可能的输出,并解释为什么1423是不可能的。我希望这里有人能帮助我。
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]);
发布于 2018-12-17 04:53:29
在fork()
之后,您有两个进程,我将其命名为A
和B
,它们执行这些操作:
1) read(fd, buf, 1);
2) read(fd, buf+1, 1);
3) printf("%c%c", buf[0], buf[1]);
您可以编写所有可能的组合。示例组合如下:
A
执行语句fileA
,从文件中读取1
并增加游标pos;fileA
执行2
语句,从文件中读取2
并增加excites语句3
中的游标pos,即。打印12
B
从fileB
读取3
从fileB
读取4
打印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]
,然后第一个进程打印它的buf1,然后第二个进程打印buf1。然后,您将获得更多的组合,因为基本上语句printf("%c%c", buf[0], buf[1])
变为两个语句printf("%c", buf[0])
和printf("%c", buf[1])
,这两个语句在每个进程中相继执行,但这两个进程都可以以任何顺序运行它们。
输出1423
是可能的,如果其中一个进程从文件中读取1
,那么另一个进程从文件中读取23
,然后其中一个进程读取4
并打印14
,然后另一个进程打印23
。
https://stackoverflow.com/questions/53805738
复制相似问题