Note that this behavior isn't specific to getline. Contents of 123.txt: 14991 arbitrary bytes
Code:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void h(FILE* fd) {
(void)fd;
pid_t p = fork();
if(!p) {
sleep(2);
exit(1);
} else if (p > 0){
int s;
waitpid( p, &s,0);
} else{
perror("Fork");
exit(2);
}
}
int main() {
FILE* fd = fopen("123.txt", "r");
if (!fd){
perror("fopen");
exit(2);
}
size_t limit = 10;
while(limit--) {
char output[10000] = {0};
ssize_t retval = fread(output, 1, 9, fd);
fprintf(stderr, "fread: %zd\n", retval);
if (retval <= 0){
exit(0);
}
h(fd);
retval = fread(output, 1, 4096, fd);
fprintf(stderr, "fread: %zu\n", retval);
if (retval <= 0){
exit(1);
}
sleep(1);
}
fclose(fd);
return 0;
}
```
Expected output:
```
fread: 9
fread: 4096
fread: 9
fread: 4096
fread: 9
fread: 4096
fread: 9
fread: 2667
fread: 0
```
Actual output:
```
fread: 9
fread: 4096
fread: 9
fread: 4096
fread: 9
fread: 4096
fread: 9
fread: 4096
fread: 9
fread: 4096
<doesn't terminate>
```
It seems that the origin of this problem is that block buffered input
streams in glibc perform calls to `lseek(2)` right before program
termination. The `lseek()` call appears to reset the file descriptor
offset to one after the last byte that was actually flushed out to user
buffers
e.g if `getline` reads "hello\n" from a file containing "hello\nworld",
the program calls `lseek(3, -6, SEEK_CUR)` at program exit. This can be
confirmed using the strace tool.
This can be resolved by flushing input buffers prior to calling fork(). So
whether this is a bug or feature remains to be seen.
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1750173
Title:
getline doesn't terminate after fork
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1750173/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs
