Suppose the disk file foobar.txt consists of the six ASCII characters "foobar". Then what is the output of the following program?
int main()
{
char c;
int fd1 = open("foobar.txt", O_RDONLY, 0);
int fd2 = open("foobar.txt", O_RDONLY, 0);
read(fd1, &c, 1);
read(fd2, &c, 1);
cout << "c = " << c << endl;
exit(0);
}
The descriptor fd1 and fd2 each have their own open file table entry, so each descriptor has its own file position for foobar.txt. Thus, the read from fd2 reads the first byte of foobar.txt, and the output is c = f and not c = o.
As before, suppose the disk file foobar.txt consists of the six ASCII characters "foobar". Then what is the output of the following program?
int main()
{
char c;
int fd = open("foobar.txt", O_RDONLY, 0);
if (fork() == 0) {
read(fd, &c, 1);
exit(0);
}
wait(NULL);
read(fd, &c, 1);
cout << "c = " << c << endl;
exit(0);
}
The child inherits the parent's descriptor table and that all processes shared the same open table file table. Thus, the descriptor fd in both the parent and child points to the same open file table entry. When the child reads the first byte of the file, the file position increases by one. Thus, the parent reads the second byte, and the output is c = o.