Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

`tee` returns `EINVAL` for every pair of pipes

Abierto
#429 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 3 días

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
40/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
c, linux, macos

Línea de trabajo

Start in sys_tee in src/syscall/io.c, where the early EINVAL return and its comment explain why copying without consuming is refused on macOS. The reproducer in the issue shows the target behaviour: tee should return the byte count, leave the source pipe readable, and copy into the destination. Done means that reproducer prints tee=5 errno=0 with both reads returning 5 bytes. Expect to find a workable approach to peeking a pipe on macOS first, which is the hard part.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

enhancement

sys_tee (src/syscall/io.c) returns EINVAL without looking at its arguments. Its comment gives the reason: copying without consuming needs a way to look into a pipe, and macOS offers none.

Reproducer:

#define _GNU_SOURCE
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    int in[2], out[2];
    char buf[8];
    pipe(in);
    pipe(out);
    write(in[1], "hello", 5);

    errno = 0;
    long n = tee(in[0], out[1], 100, SPLICE_F_NONBLOCK);
    printf("tee=%ld errno=%d\n", n, errno);
    if (n > 0)
        printf("copied=%zd still in the source=%zd\n",
               read(out[0], buf, sizeof(buf)), read(in[0], buf, sizeof(buf)));
    return 0;
}
result
elfuse b57f367 tee=-1 errno=22
Linux 6.12 under qemu tee=5 errno=0, then copied=5 still in the source=5

EINVAL is what tee(2) documents for descriptors that are not both pipes, so that is how a guest reads the refusal.

Lenguaje dominante
C
Estrellas
273
Forks
29
Merge medio
2 d 10 h
PR fusionados (30 d)
17

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de sysprog21/elfuse

Todos los issues de sysprog21/elfuse

Issues similares

Más issues de C

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.