Hello all,

I have some strange effects when writing to FIFOs from user space with
write(). When I am trying to write my data(a struct)  to the FIFO, I get a
segmentation fault.

I got around this by doing 

memset (&cfg, 0, sizeof (CONFIG_DATA));

at the beginning of the function. How can this be ? I thought the data I
pass to write is handled like a buffer with n Bytes, but if seg fault
happens, somebody has to be interpreting something here ?

I put some pieces of code below. Maybe somebody can tell me whats wrong
here, if not, i'll just do my memset :).

Thanks in advance,

Marco Schwarz.



The function that looks like follows:

int rtc_config_add_card (int nIfNr, int nBusType, int nPCIBus, int nPCISlot,
int nDeviceID, int nVendorID, int nRefreshTime,
        
RTC_RETURN *ret)
{
        CONFIG_DATA cfg;
        int nBytesRead, nBytesSent;

        /* Segmentation fault if not set to 0 !!! */
        memset (&cfg, 0, sizeof (CONFIG_DATA));
        
        cfg.nConfigAction = CA_ADD_CARD;
        cfg.nIfNr                                       = nIfNr;
        cfg.nBusType                    = nBusType;
        cfg.nPCIBus                             = nPCIBus;
        cfg.nPCISlot                    = nPCISlot;
        cfg.nDeviceID                   = nDeviceID;
        cfg.nVendorID                   = nVendorID;
        cfg.nRefreshTime        = nRefreshTime;
                
        printf ("\nADD_CARD\n");
        printf ("cfg.nIfNr:         %d\n",cfg.nIfNr);
        printf ("cfg.nBusTyp:       %d\n",cfg.nBusType);
        printf ("cfg.nPCIBus:       %d\n",cfg.nPCIBus);
        printf ("cfg.nPCISlot:      %d\n",cfg.nPCISlot);
        printf ("cfg.nDeviceID:     %x\n",cfg.nDeviceID);
        printf ("cfg.nVendorID:     %x\n",cfg.nVendorID);
        printf ("cfg.nRefreshTime:  %d\n",cfg.nRefreshTime);
        
        nBytesSent = write(nConfigSendFIFO, &cfg, sizeof(CONFIG_DATA));
        nBytesRead = read(nConfigReceiveFIFO, ret, sizeof(RTC_RETURN));

        if (nBytesRead == sizeof (CONFIG_DATA))
                return 0;
        else
                return -1;
}

Structure definition:

typedef struct
{
  /* Allg. Teil */
  int nConfigAction;
        
  /* Kartenkonfiguration */
  int nIfNr;
  int nBusType;
  int nPCIBus;
  int nPCISlot;
  int nDeviceID;
  int nVendorID;
  int nRefreshTime;
        
  /* Signalkonfiguration */
  int nSigNr;
  int nSigType;
  int nSigVM;
  int nSigVMGrad;
  int nSigVI;
  int nSigVIInc;
  int nConvPar;
  float fRangeMax;
  float fRangeMin;
} CONFIG_DATA;


-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
---
For more information on Real-Time Linux see:
http://www.rtlinux.org/rtlinux/

Reply via email to