Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: Łącza nienazwane / Dziwne zjawisko  (Przeczytany 2810 razy)

twardziel

  • Gość
Łącza nienazwane / Dziwne zjawisko
« dnia: 2012-01-10, 23:22:08 »
Po odpaleniu tego programiku jest wyświetlany oczekiwany wynik z tym że później z terminalem dzieję się coś takiego, że nie wyświetla tego co pisze na klawiaturze (tak jak przy wpisywaniu hasła) .

#include 
#include
#include

int main()
{
int pdesk[2];
pipe(pdesk);
if(fork() == 0)
{
int pdesk2[2];
close(0);
dup2(pdesk[0], 0);
close(pdesk[1]);

pipe(pdesk2);

if(fork() == 0)
{
close(0);
dup2(pdesk2[0], 0);
close(pdesk2[1]);
execlp("more", "more", 0);
exit(0);
}
close(1);
dup2(pdesk2[1], 1);
close(pdesk2[0]);
execlp("grep", "grep", "^d", 0);
exit(0);
}
close(1);
dup2(pdesk[1], 1);
close(pdesk[0]);
execlp("ls", "ls", "-l", 0);

return 0;
}

ZipoKing

  • Gość
Łącza nienazwane / Dziwne zjawisko
« Odpowiedź #1 dnia: 2012-01-11, 11:23:53 »
1. Czy close() bądź dup2() zwracają jakiś błąd?
2. Pamiętaj, że przy fork() proces potomny współdzieli otwarte pliki (ale tworzy swoją kopię deskryptorów plików) ale operuje na swojej pamięci, więc operacje na pdesk są tutaj nieco niebezpieczne.
3. Spróbuj uruchomić program poprzez strace albo gdb i zobacz, co się dzieje z deskryptorami. Problem tutaj może być taki, że wykonując close(0) zamykasz także strumień wejściowy dla powłoki.

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Łącza nienazwane / Dziwne zjawisko
« Odpowiedź #2 dnia: 2012-01-11, 11:35:23 »
To dziwne zjawisko to wyścigi procesów. U Ciebie ls jest rodzicem grepa, który jest rodzicem more. More wyłącza echo klawiatury.

Jeżeli ls albo grep zakończy działanie przed morem, to zostanie on sierotą i nie włączy ponownie echa, albo zachowa się w w sposób, który trudno przewidzieć.

Teraz masz taki strumień:
ls -> grep ->more
"ls" kończy działanie jako pierwszy i strumień jest przerwany. Musisz napisać strumień w drugą stronę, w taki sposób, że rodzic będzie zawsze kończył działanie po swoich potomkach, czyli po prostu zrobić mora rodzicem grepa, który z kolei jest rodzicem ls.

czyli coś takiego:
more <- grep <- ls
Wtedy masz pewność, że rodzic nie zakończy wykonania przed potomkiem.

#include 
#include
#include

int main(int argc, char *argv[])
{
    int pdesk[2];
    pipe(pdesk);
    if(fork() == 0)
    {
        int pdesk2[2];
        pipe(pdesk2);
       
        if(fork() == 0)
        {
            close(1);
            dup2(pdesk2[1], 1);
            close(pdesk2[0]);
            execlp("ls", "ls", "-la", NULL);
            exit(0);
        }
        close(0);
        dup2(pdesk[1], 1);
        close(pdesk[0]);
        dup2(pdesk2[0], 0);
        close(pdesk2[1]);
        execlp("grep", "grep", "^d", NULL);
        exit(0);
    }
    close(0);
    dup2(pdesk[0], 0);
    close(pdesk[1]);
    execlp("more", "more", NULL);
   
    return 0;
}