close(9E)




NAME

     close - relinquish access to a device


SYNOPSIS

  Block and Character
     #include <sys/types.h>
     #include <sys/file.h>
     #include <sys/errno.h>
     #include <sys/open.h>
     #include <sys/cred.h>
     #include <sys/ddi.h>
     #include <sys/sunddi.h>

     int  prefixclose(dev_t  dev,  int  flag,  int  otyp,  cred_t
     *cred_p);

  STREAMS
     #include <sys/types.h>
     #include <sys/stream.h>
     #include <sys/file.h>
     #include <sys/errno.h>
     #include <sys/open.h>
     #include <sys/cred.h>
     #include <sys/ddi.h>
     #include <sys/sunddi.h>

     int prefixclose(queue_t *q, int flag, cred_t *cred_p);


INTERFACE LEVEL

     Architecture independent level 1 (DDI/DKI). This entry point
     is required for block devices.


PARAMETERS

  Block and Character
     dev   Device number.

     flag  File status flag, as set by the  open(2)  or  modified
           by  the  fcntl(2) system calls. The flag is for infor-
           mation only-the file  should  always  be  closed  com-
           pletely. Possible values are:   FEXCL, FNDELAY, FREAD,
           FKLYR, and  FWRITE. Refer to open(9E) for more  infor-
           mation.

     otyp  Parameter supplied so that the  driver  can  determine
           how  many  times a device was opened and for what rea-
           sons.  The flags assume the   open()  routine  may  be
           called  many  times,  but  the  close() routine should
           only be called on the last  close() of a device.

           OTYP_BLK
                 Close was through block interface for  the  dev-
                 ice.

           OTYP_CHR
                 Close was through  the  raw/character  interface
                 for the device.

           OTYP_LYR
                 Close a layered process (a  higher-level  driver
                 called the close() routine of the device).

     *cred_p
           Pointer to the  user credential structure.

  STREAMS
     *q    Pointer to  queue(9S) structure used to reference  the
           read side of the driver.  (A queue is the central node
           of a collection of structures and routines pointed  to
           by a queue.)

     flag  File status flag.

     *cred_p
           Pointer to the  user credential structure.


DESCRIPTION

     For STREAMS drivers, the  close() routine is called  by  the
     kernel  through  the  cb_ops(9S) table entry for the device.
     (Modules use the  fmodsw table.) A  non-null  value  in  the
     d_str  field  of  the   cb_ops  entry points to a  streamtab
     structure, which points to a qinit(9S) containing a  pointer
     to  the   close() routine. Non-STREAMS  close() routines are
     called directly from the  cb_ops table.

     close() ends the connection between the user process and the
     device,  and  prepares the device (hardware and software) so
     that it is ready to be opened again.

     A device may be opened simultaneously by multiple  processes
     and  the  open() driver routine is called for each open, but
     the kernel will only call the  close() routine when the last
     process  using  the  device issues a  close(2) or  umount(2)
     system call or exits.  (An exception is  a  close  occurring
     with  the  otyp argument set to  OTYP_LYR, for which a close
     (also having otyp = OTYP_LYR) occurs for each open.)

     In general, a  close() routine should always check the vali-
     dity  of  the  minor number component of the  dev parameter.
     The routine should also check permissions as  necessary,  by
     using  the user credential structure (if pertinent), and the
     appropriateness of the  flag and  otyp parameter values.

     close() could perform any of  the  following  general  func-
     tions:
        o  disable interrupts

        o  hang up phone lines

        o  rewind a tape

        o  deallocate buffers from a private buffering scheme

        o  unlock an unsharable device (that was  locked  in  the
           open() routine)

        o  flush buffers

        o  notify a device of the close

        o  deallocate any resources allocated on open

     The  close() routines of STREAMS  drivers  and  modules  are
     called  when  a stream is dismantled or a module popped. The
     steps for dismantling a stream are performed in the  follow-
     ing order. First, any multiplexor links present are unlinked
     and the  lower streams are closed. Next, the following steps
     are  performed  for  each  module  or  driver on the stream,
     starting at the head and working toward the tail:

     1. The write queue is given a chance to drain.

     2. The  close() routine is called.

     3. The module or driver is removed from the stream.


RETURN VALUES

     close() should return 0  for  success,  or  the  appropriate
     error  number.  Return errors rarely occur, but if a failure
     is detected, the driver should decide whether  the  severity
     of  the  problem warrants either displaying a message on the
     console or, in worst cases, triggering a system panic.  Gen-
     erally,  a  failure  in  a  close() routine occurs because a
     problem occurred in the associated device.


SEE ALSO

     close(2),   fcntl(2),   open(2),   umount(2),    detach(9E),
     open(9E), cb_ops(9S), qinit(9S), queue(9S)

     Writing Device Drivers

     STREAMS Programming Guide


Man(1) output converted with man2html