Potok nienazwany bez użycia fork();

0

Cześć wszystkim,

potrzebuje utworzyć potok nienazwany bez użycia fork();, czy ktoś posiada jakieś informację na ten temat?

Mam kod z forkiem, ale potrzebuje bez niego.

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define KOM "Message to parent\n"
int main()
{
    int potok_fd[2], count, status;
    char bufor[BUFSIZ];
    pipe(potok_fd);
    if (fork() == 0) {
        write(potok_fd[1], KOM, strlen(KOM));
        exit(0);
    }
    close(potok_fd[1]);
    while ((count = read(potok_fd[0], bufor, BUFSIZ)) > 0)
        write(1, bufor, count);
    wait(&status);
    return (status);
}
0

Utworzyć to go można bez forka, ale jak chcesz go potem używać? Zdefiniuj problem.

0

Potrzebuję utworzyć dwa procesy master, slave i przesłać pomiędzy nimi wiadomość potokiem nienazwanym bez użycia forka. Wyczytałem, że można to zrobić za pomocą ./proc1 | ./proc2 wczytując zwyczajnie wiadomość i odczytując ją. Mam tez kolejny kod, nie występuje w nim fork, ale jak podzelić to teraz na dwa procesy?

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
#define KOM "Message to parent\n"
int main()
{
    int potok_fd[2], count;
    char bufor[BUFSIZ];
    pipe(potok_fd);
    write(potok_fd[1], KOM, strlen(KOM));
    fcntl(potok_fd[0], F_SETFL, O_NONBLOCK);
    while ((count = read(potok_fd[0], bufor, BUFSIZ)) > 0)
        write(1, bufor, count);
    return 0;
}
1

Jeden wtedy pisze do stdout, drugi czyta stdin, a za forkowanie i stworzenie potoku odpowiada shell. Tzn. zakładając, że chcesz użyć wywołania ze znakiem |

0

Za bardzo nic mi to nie mówi - dla mnie to kompletnie nowy temat. Rozpiszę może jeszcze raz. Po przewertowaniu kilkunastu stron wyczytałem, że potok nienazwany mogę utworzyć stosując znak |, zrobiłem więc jeden proces, który pobiera tekst a drugi który go odbiera czyli ./proc1 | ./proc2 (zwykly scanf i printf - niby działa). Jednak chciałbym znaleźć rozwiązanie, które omija używanie znaku dostałem kod z #3 postu - też działa, ale chciałbym go podzielić teraz na proc1 i proc2 (master i slave) - da radę?

1

Nie. Tzn. może możnaby robić jakąś magię typu otwieranie pliku przez procfs (nie wiem, czy to zadziała), ale raczej na pewno nie będzie to rozwiązanie prawidłowe czy przenośne. Jeżeli chcesz skomunikować dowolne procesy użyj named pipe.

Tak btw, znak | to nic innego jak 2x fork(), pipe() oraz dup2(). To, że nie wołasz forka jawnie, nie znaczy, że go nie ma.

1 użytkowników online, w tym zalogowanych: 0, gości: 1