Bu kod ile bazı sorunlar deniyorum:boru çağrı ve senkronizasyon
#include <stdio.h>
#include <stdlib.h>
#define SIZE 30
#define Error_(x) { perror(x); exit(1); }
int main(int argc, char *argv[]) {
char message[SIZE];
int pid, status, ret, fd[2];
ret = pipe(fd);
if(ret == -1) Error_("Pipe creation");
if((pid = fork()) == -1) Error_("Fork error");
if(pid == 0){ //child process: reader (child wants to receive data from the parent)
close(fd[1]); //reader closes unused ch.
while(read(fd[0], message, SIZE) > 0)
printf("Message: %s", message);
close(fd[0]);
}
else{//parent: writer (reads from STDIN, sends data to the child)
close(fd[0]);
puts("Tipe some text ('quit to exit')");
do{
fgets(message, SIZE, stdin);
write(fd[1], message, SIZE);
}while(strcmp(message, "quit\n") != 0);
close(fd[1]);
wait(&status);
}
}
Kod çalışıyor ama neden açıklayamam! Ebeveyn ve çocuk süreçleri arasında açık bir senkronizasyon yoktur. Alt işlem, ana işlemden önce yürütülürse, okuma 0'a dönmeli ve işlem bitmeli, ancak bazı nedenlerden dolayı üst yürütmeyi bekler. Bunu nasıl açıklıyorsunuz? Belki bir şey özlüyorum.
(Düzenleyen)
Okumanın neden geri dönmesini beklersiniz? Hiçbir yerde engellemeyen G/Ç ayarlamıyorsunuz. – Mat
... Ve engellemeyen G/Ç için bile 0 olmaz. –
İşlem için "engelleme" engellendi mi? –