Изменить формат даты [дубликат]

Y aquí hay un código de ejemplo que hace precisamente eso.

#include <err.h>
#include <stdio.h>
#include <unistd.h>

char buf[8];

int main(int argc, char *argv[])
{
    int ch, fd[2], rv;

    pipe(fd);

    switch (fork()) {
    case -1:
        err(1, "could not fork");
    case 0:                    // child
        rv = lseek(STDIN_FILENO, -7, SEEK_END);
        if (rv == -1) err(1, "could not seek");
        sleep(3);
        close(fd[1]);
        break;
    default:                   // parent
        close(fd[1]);
        read(fd[0], &ch, 1);
        read(STDIN_FILENO, buf, 7);
        printf("read '%s'\n", buf);
    }
    return 0;
}

lo que sucede es que el padre bloquea esperando al hijo y mientras tanto el hijo busca hasta el final de la entrada estándar, menos siete, luego cierra el pipe(2)al padre. Esto desbloquea el padre, que lee desde el descriptor compartido desde donde el hijo movió el puntero del archivo compartido.

$ make sharedseek
cc     sharedseek.c   -o sharedseek
$ echo asdfasdfasdf123456 > x
$./sharedseek < x
read '123456
'
$ 

Esto no funcionará si no se puede buscar la entrada estándar. También es realmente necesaria la canalización (o alguna forma de comunicación )ya que, de lo contrario, el padre puede correr antes que el hijo.

Si el descriptor del archivo no se compartió, el elemento principal no leería desde donde el elemento secundario movió el puntero.

0
07.11.2017, 04:20
0 ответов

Теги

Похожие вопросы