komunikacja między procesami poprzez fifo

0

Witam,

Piszę ponieważ mam straszny problem z opracowaniem komunikacji między procesami w unixie za pomocą fifo. Utknąłem zaraz na początku bo jakieś dziwne rzeczy dzieją się już z samą kolejką. Wklejam kawałek kody gdzie występuje błąd. Polega on na tym, że po stworzeniu kolejki wszysko się ładnie wykonuje, aż do napotkania kolejki ' close(fd) ' po czym program niespodziewanie się kończy. Może na tym kodzie tego nie widać, ale printfy po ww. instrukcji nie działają. Program się kończy, a w konsoli pokazuje się ścieżka bieżącego katalogu i znak zachęty :| ... konsola po uruchomieniu programu wygląda generalnie tak:

 
/...ścieżka...$ ./proces1
** PM: moj PID=2155
KOLEJKA JUZ ISTNIEJE!!
KOLEJKA 2 JUZ ISTNIEJE!!
wprowadź tekst
asdas
asdas
BUFFSIZE: 6
/...ścieżka...$ 

niżej kod programu


#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include "proj.h"
#define FIFO1 "/fifo"
#define FIFO2 "fifo2"

int semid,semid2,shid,shid2;
int desk1,desk2,desk3,pauza_p1=0,pauza_p2=0,pauza_p3=0,pob=0,oczekujacysygnal=0;
int * mem,* mem2;
int st,stold,run=1;
int fd,f1,f2;

char wejscie;
char buffor [1024];
char buffor2 [1024];
int WielkoscBuffora;



int proces1(){  
    
    
    // PROCES 1 ZAPIS DANYCH DO KOLEJKI FIFO1
    
    if(fd=open(FIFO1,O_WRONLY|0666)<0){
        switch( errno) {
            case EEXIST: 
                printf("BLAD");break; 
        }}
    
    printf("wprowadź tekst\n");
    
    while(run) { 
        
        int i=0;
        scanf("%c",&wejscie);
        while(wejscie!='\n')
        {
            buffor[i++]=wejscie; 
            scanf("%c",&wejscie); 
        }
        buffor[i]='\0'; 
        
        write(fd,buffor,strlen(buffor)+1);
        WielkoscBuffora=(strlen(buffor)+1);
        printf("\n");
        printf("BUFFSIZE: %d\n",WielkoscBuffora);
        break;
    }
    
    
    
    if((close(fd))<0){
        switch( errno) {
            case EBADF: 
                printf("BŁAD!!\n");break; 
            case EINTR: 
                printf("BŁĄD2!!\n");break; 
            case EIO: 
                printf("BŁĄD#!\n");break; 
        }}
    else printf("dobra, zamnkęło się!!\n");

    return 0;
}




int main() { 
    int i; 
    pid_t p[3];
    int status;
    
    
          printf("** PM: moj PID=%d\n",getpid());
  
     if(f1=mkfifo(FIFO1,O_CREAT|0666)<0){
     switch( errno) {
     case EEXIST: 
     printf("KOLEJKA JUZ ISTNIEJE!!\n");break; 
     }}
    if(f2=mkfifo(FIFO2,O_CREAT|0666)<0){
        switch( errno) {
            case EEXIST: 
                printf("KOLEJKA 2 JUZ ISTNIEJE!!\n");break; 
        }}
    
    printf("%d",proces1());
     
 
          
          return 0;
          
          }
          


 

błagam pomóżcie, bo już drugą noc prze to nie śpie

0

linijka :

if(fd=open(FIFO1,O_WRONLY|0666)<0)

jest błędna, kolejność operatorów sprawi że :

  1. wywołana zostanie funkcja open(FIFO1,O_WRONLY|0666)
  2. To co zwróci zostanie poddane operacji logicznej : return <0
    a) w przypadku błędu -1 < 0 operacja zwróci prawda(1)
    b) w przypadku poprawnego otwarcia funkcja zwraca deskryptor(większy od zero) wiec dostaniemy fałsz(0)
  3. wynik zostanie przypisany do fd czyli mamy tutaj zawsze wartość 0 lub 1 a nie deskryptor.
  4. zostanie sprawdzony warunek
if (fd = jakas liczba) 

czyli nie to co chciałeś... dodając jeden nawias otrzymasz :

if((fd=open(FIFO1,O_WRONLY|0666))<0)

w ten sposób wynik zostanie najpierw przypisany do fd, następnie całość zostanie porównana, czyli teraz jest ok.
Po takiej poprawie powinieneś dostać błąd, Invalid argument czy jakoś tak (errno == 22), open nie nadaje uprawnień dla plików, pomyliłeś z mkfifo!! wywal 0666 czyli cała poprawa linijka:

 if((fd=open(FIFO1,O_WRONLY))<0){

Ponadto podobny błąd masz przy wywołaniu mkfifo, tez dodaj nawiasy.

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