2013-05-10 2 views
0

ребята! Я пытаюсь сделать свою первую программу, которая использует именованные каналы или fifo. Клиент отправляет целые положительные числа сервера. Когда отправляется отрицательное число, передача закрывается. Сервер определяет минимальное количество отправленных, максимальное число и отправляет два значения обратно клиенту. Проблема в том, что всегда печатные max и min равны нулю, и я действительно не знаю, как решить проблему. Это то, что я до сих пор:именованные каналы (fifo) программа не работает

client.c

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 

main(){ 
    int f1,f2; 
    int n,a,b; 
    printf("Give the number: "); 
    scanf("%d",&n); 
    while(n >= 0){ 
    printf("Give the number: "); 
    scanf("%d",&n); 
    } 
    f1=open("fifo1",O_WRONLY); 
    f2=open("fifo2",O_RDONLY); 
    if(f1<0){ 
    printf("You can't write in the fifo client"); 
    } 
    if(f2<0){ 
    printf("You can't read from the fifo client"); 
    } 
    write(f1,&n,sizeof(int)); 
    read(f2,&a,sizeof(int)); 
    read(f2,&b,sizeof(int)); 
    printf("The minimum number is %d\n",a); 
    printf("The maximum number is %d\n",b); 
    close(f2); 
    close(f1); 
} 

server.c

#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 

int minim=0; 
int maxim=0; 

int min(int n){ 
if(n>=0 && minim > n){ 
minim=n; 
} 
return minim; 
} 

int max(int n){ 
if (n > maxim){ 
maxim=n; 
} 
return maxim; 
} 


main(){ 
    int f1,f2,a,b,n; 
    f1=open("fifo1",O_RDONLY); 
    f2=open("fifo2",O_WRONLY); 
    if(f1<0){ 
    printf("error"); 
    } 
    if(f2<0){ 
    printf("error"); 
    } 
    read(f1,&n,sizeof(int)); 
    a = min(n); 
    b = max(n); 
    write(f2,&a,sizeof(int)); 
    write(f2,&b,sizeof(int)); 
    close(f1); 
    close(f2); 
} 
+1

Вы в том же классе, что и вы, тот же человек, что и человек, который спросил [этот очень похожий вопрос] (http://stackoverflow.com/questions/16482874)? – pilcrow

+0

@pilcrow Да, я тот же человек, но я забыл пароль с этой учетной записи. :(Но как это уместно для моего вопроса? –

+0

И я нахожу странным тон вопроса: на самом деле именованные каналы работают как задокументированные, вам просто сложно выяснить, как их правильно использовать. Это не именованные каналы «Ошибка (или ошибка ядра). –

ответ

2

Это довольно простое решение.

Для 1, вам нужно сделать fifo с mkfifo. Idk, если вы сделали это раньше в отдельной программе или файл уже существует, но без этого вы ничего не получите.

Для 2 нет gaurentee, когда вы читаете на сервере, на который был записан файл. Если клиент работает первым, вам необходимо очистить свой вызов для записи, чтобы убедиться, что fifo был записан в первую очередь. Это можно сделать с помощью функции fsync(). После того, как вы fsync() в этом файловом дескрипторе, файл будет записан в, и вы можете gaurentee значения будут там, чтобы сервер читал. Проверьте это, если сервер прочитает fifo и затем выводит то, что он читает.

+0

Я сделал fifo1 и fifo2, оба с mkfifo. Итак, все, что я делал, работает? Я не понимаю, где мне нужно использовать fsync(). вы скажите мне, где именно? –

+0

После каждого вызова записи. Когда вы пишете файл-дескриптор, он фактически не записывает файл на жесткий диск, он записывает его в специальный буфер в Linux ядро. Если вы должны были написать программу yoru и вытащить вилку на свой компьютер, изменения не будут отображаться в файле. После каждой записи поместите fsync (fd), а затем вытащите вилку после fsync, и вы увидите, что файл был записан, потому что вы его сбросили. СДЕЛАЙТЕ ЭТО ПОСЛЕ КАЖДОГО ПИСЬМА, ЧТОБЫ УБЕЖДАТЬ ЕГО (или делать это после последней записи). – Magn3s1um

+0

Кроме того, нет гарантии, что вы пишете файл до того, как сервер прочитает его. Как вы гарантируете правильную синхронизацию времени? – Magn3s1um

Смежные вопросы