>
> Try to construct a minimal reproducer, and post it here.  Someone may
> be able to spot the issue.  The shorter and simpler you can make your

reproducer, the more likely someone will be able to help.


The program:

// gcc -o program program.c
// program < lines

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int, char **) {
    char *  line_buf = NULL;
    size_t  stg_size = 0u;
    ssize_t num_read = 0;
    size_t  line_num = 0;

    while (-1 < (num_read = getline(&line_buf, &stg_size, stdin))) {
        ++line_num;
        printf("%s", line_buf);
        if (num_read != 53) {
            printf("num_read: %ld at line %lu\n", num_read, line_num);
        }

        pid_t pid = fork();
        if (0 == pid) {
            exit(0);
        }
        else if (pid > 0) {
            (void) waitpid(pid, NULL, 0);
        }
    }
    return(0);
}

Without the fork/exit/waitpid block of code, it prints the input
successfully.  With that code included, it goes into an infinite loop
printing the first 78 lines of input,  Every second pass over the input,the
78th line is garbled.
77                77        77        77        77xx
78              1         1xx
num_read: 30 at line 6433
2                  2         2         2         2xx

The input file "lines" is (all lines 52 charactures + \n == 53 characters):
1                  1         1         1         1xx
2                  2         2         2         2xx
3                  3         3         3         3xx
4                  4         4         4         4xx
5                  5         5         5         5xx
6                  6         6         6         6xx
7                  7         7         7         7xx
8                  8         8         8         8xx
9                  9         9         9         9xx
10                10        10        10        10xx
11                11        11        11        11xx
12                12        12        12        12xx
13                13        13        13        13xx
14                14        14        14        14xx
15                15        15        15        15xx
16                16        16        16        16xx
17                17        17        17        17xx
18                18        18        18        18xx
19                19        19        19        19xx
20                20        20        20        20xx
21                21        21        21        21xx
22                22        22        22        22xx
23                23        23        23        23xx
24                24        24        24        24xx
25                25        25        25        25xx
26                26        26        26        26xx
27                27        27        27        27xx
28                28        28        28        28xx
29                29        29        29        29xx
30                30        30        30        30xx
31                31        31        31        31xx
32                32        32        32        32xx
33                33        33        33        33xx
34                34        34        34        34xx
35                35        35        35        35xx
36                36        36        36        36xx
37                37        37        37        37xx
38                38        38        38        38xx
39                39        39        39        39xx
40                40        40        40        40xx
41                41        41        41        41xx
42                42        42        42        42xx
43                43        43        43        43xx
44                44        44        44        44xx
45                45        45        45        45xx
46                46        46        46        46xx
47                47        47        47        47xx
48                48        48        48        48xx
49                49        49        49        49xx
50                50        50        50        50xx
51                51        51        51        51xx
52                52        52        52        52xx
53                53        53        53        53xx
54                54        54        54        54xx
55                55        55        55        55xx
56                56        56        56        56xx
57                57        57        57        57xx
58                58        58        58        58xx
59                59        59        59        59xx
60                60        60        60        60xx
61                61        61        61        61xx
62                62        62        62        62xx
63                63        63        63        63xx
64                64        64        64        64xx
65                65        65        65        65xx
66                66        66        66        66xx
67                67        67        67        67xx
68                68        68        68        68xx
69                69        69        69        69xx
70                70        70        70        70xx
71                71        71        71        71xx
72                72        72        72        72xx
73                73        73        73        73xx
74                74        74        74        74xx
75                75        75        75        75xx
76                76        76        76        76xx
77                77        77        77        77xx
78                78        78        78        78xx
79                79        79        79        79xx
80                80        80        80        80xx
81                81        81        81        81xx
82                82        82        82        82xx
83                83        83        83        83xx
84                84        84        84        84xx
85                85        85        85        85xx
86                86        86        86        86xx
87                87        87        87        87xx
88                88        88        88        88xx
89                89        89        89        89xx
90                90        90        90        90xx
91                91        91        91        91xx
92                92        92        92        92xx
93                93        93        93        93xx
94                94        94        94        94xx
95                95        95        95        95xx
96                96        96        96        96xx
97                97        97        97        97xx
98                98        98        98        98xx
99                99        99        99        99xx
100              100       100       100       100xx

which can be created using this Perl script,

#!/usr/bin/env perl
for ($i=1; $i <= 100; ++$i)
{
    printf("%-10d%10d%10d%10d%10dxx\n", $i, $i, $i, $i, $i);
}

Reply via email to