Na początku powiem, że moje doświadczenie w c to zrobienie kilku pętli 3 lata temu więc proszę o rady jak dla idioty, także nie planuje w tym języku zostawić dłużej niż potrzebuje na zajęcia.
Mam do napisania program tworzący dwa procesy gdzie pierwszy odczytuje tekst z klawiatury i wysyła go łączem do drugiego i oczekuje na potwierdzenie również przez łącze i kończy działanie po wysłaniu pustego tekstu. Drugi proces powinien czekać na komunikat i potwierdzać odbiór. Mam wykorzystać funkcje exec() i przekierowania przekierowywanie standardowych deskryptorów (drugi proces powinien
odczytywać deskryptor 0 i zapisywać na deskryptorze 1).
Jednak efekt jaki osiągnąłem jest taki, że raz duplikuje moją wpisaną wiadomość a raz odpisuje że odebrało
(zielone to wpisane przeze mnie)
Kod rodzica
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
int pipefd[2];
pid_t cpid;
char buf[1024];
char message[1024];
if (pipe(pipefd) == -1) {
printf("Error in pipe");
}
cpid = fork();
if (cpid == -1) {
printf("Error in fork");
}
if (cpid == 0) { /* Child reads from pipe */
close(pipefd[0]);
close(pipefd[1]);
execl("./child_pipe", "child_pipe", NULL);
printf("Error in execl\n");
} else {
while (1) {
fgets (message, 1023, stdin);
if ((message[0] == '\n') || ( message[0] == '\r' && message[1] == '\n') || (message[0] == '\n')|| (message[0] == ' ')|| (message[0] == 0))
break;
if (atoi(&message[0]) == 10) {
break;
}
if(write(pipefd[1], &message, 1023)==-1)
printf("Error in close write\n");
if(read(pipefd[0], &buf, 1023) == -1)
printf("Error in read\n");
printf("%s",buf);
}
exit(0);
}
}
kod dziecka
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
char message[1024];
char response[1024] = "Received\n";
int pipefd[2];
int main ()
{
int i;
while(1) {
if((i = read(pipefd[1], &message, 1023)>0) && i!=-1){
if (write(pipefd[0], &response, 1023)==-1)
printf("Error in close write\n");
}
if(i==-1){
printf("Error in read\n");
}
}
}
- screenshot-20211112222938.png (7 KB) - ściągnięć: 10