open(9e) 맨 페이지 - 윈디하나의 솔라나라

개요

섹션
맨 페이지 이름
검색(S)

open(9e)

open(9E)                      Driver Entry Points                     open(9E)

NAME
       open - gain 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 prefix_open(dev_t *devp, int flag, int otyp,
            cred_t *cred_p);

   STREAMS
       #include <sys/file.h>
       #include <sys/stream.h>
       #include <sys/ddi.h>
       #include <sys/sunddi.h>

       int prefix_open(queue_t *q, dev_t *devp, int oflag, int sflag,
            cred_t *cred_p);

INTERFACE LEVEL
       Architecture  independent  level  1  (DDI/DKI). This entry point is re‐
       quired, but it can be nulldev(9F)

PARAMETERS
   Block and Character
       devp      Pointer to a device number.


       flag      A bit field passed from the user program open(2) system  call
                 that instructs the driver on how to open the file. Valid set‐
                 tings are:

                 FEXCL      Open  the  device  with exclusive access; fail all
                            other attempts to open the device.


                 FNDELAY    Open the device and  return  immediately.  Do  not
                            block the open even if something is wrong.


                 FREAD      Open the device with read-only permission, If ORed
                            with FWRITE, allow both read and write access.


                 FWRITE     Open  a device with write-only permission. If ORed
                            with FREAD, allow both read and write access.



       otyp      Parameter supplied for driver to determine how many  times  a
                 device  was  opened  and  for  what reasons. For OTYP_BLK and
                 OTYP_CHR, the open() function can be called many  times,  but
                 the close(9E) function is called only when the last reference
                 to  a  device  is  removed. If the device is accessed through
                 file descriptors, it  is  done  by  a  call  to  close(2)  or
                 exit(2). If the device is accessed through memory mapping, it
                 is  done  by  a  call  to munmap(2) or exit(2). For OTYP_LYR,
                 there is exactly one close(9E) for each open() operation that
                 is called. This permits software drivers to exist above hard‐
                 ware drivers and removes any ambiguity from the hardware dri‐
                 ver regarding how a device is used.

                 OTYP_BLK    Open occurred through block interface for the de‐
                             vice.


                 OTYP_CHR    Open occurred through the raw/character interface
                             for the device.


                 OTYP_LYR    Open a layered process. This flag  is  used  when
                             one  driver  calls  another  driver's  open()  or
                             close(9E) function. The  calling  driver  ensures
                             that  there is one-layered close for each layered
                             open. This flag applies to both block and charac‐
                             ter devices.



       cred_p    Pointer to the user credential structure.


   STREAMS
       q         A pointer to the read queue.


       devp      Pointer to a device number. For STREAMS modules, devp  always
                 points to the device number associated with the driver at the
                 end (tail) of the stream.


       oflag     Valid  oflag  values are FEXCL, FNDELAY, FREAD, and FWRITEL —
                 the same as those listed above for flag..  For  STREAMS  mod‐
                 ules, oflag is always set to 0.


       sflag     Valid values are as follows:

                 CLONEOPEN    Indicates  that  the  open()  function is called
                              through the clone driver. The driver should  re‐
                              turn a unique device number.


                 MODOPEN      Modules  should be called with sflag set to this
                              value. Modules should return an  error  if  they
                              are  called with sflag set to a different value.
                              Drivers should  return  an  error  if  they  are
                              called with sflag set to this value.


                 0            Indicates  a  driver is opened directly, without
                              calling the clone driver.



       cred_p    Pointer to the user credential structure.


DESCRIPTION
       The driver's open() function is called by the kernel during an  open(2)
       or  a  mount(2)  on  the  special  file for the device. A device can be
       opened simultaneously by multiple processes and the open() driver oper‐
       ation is called for each open. Note that a device  is  referenced  once
       its  associated  open(9E) function is entered, and thus open(9E) opera‐
       tions which have not yet completed will prevent  close(9E)  from  being
       called.  The  function should verify that the minor number component of
       *devp is valid, that the type of access requested by otyp and  flag  is
       appropriate  for  the device, and, if required, check permissions using
       the user credentials pointed to by cred_p.


       The kernel provides open()  close() exclusion guarantees to the  driver
       at  *devp, otyp granularity. This delays new open() calls to the driver
       while a last-reference close() call is executing. If the driver has in‐
       dicated  that  an  EINTR  returns  safe  via  the  D_OPEN_RETURNS_EINTR
       cb_ops(9S)   cb_flag,  a  delayed open() may be interrupted by a signal
       that results in an EINTR return.


       Last-reference accounting and open()  close() exclusion typically  sim‐
       plify  driver writing. In some cases, however, they might be an impedi‐
       ment for certain types of drivers. To overcome any impediment, the dri‐
       ver can change minor numbers in open(9E), as described below, or imple‐
       ment multiple minor nodes for the same device. Both techniques give the
       driver control over when close() calls  occur  and  whether  additional
       open() calls will be delayed while close() is executing.


       The  open() function is passed a pointer to a device number so that the
       driver can change the minor number. This allows drivers to  dynamically
       create  minor  instances  of  the device. An example of this might be a
       pseudo-terminal driver that creates a new pseudo-terminal  whenever  it
       is opened. A driver that chooses the minor number dynamically, normally
       creates    only    one   minor   device   node   in   attach(9E)   with
       ddi_create_minor_node(9F). It then changes the minor  number  component
       of  *devp  using  makedevice(9F)  and getmajor(9F). The driver needs to
       keep track of available minor numbers internally. A driver that dynami‐
       cally creates minor numbers might want to avoid returning the  original
       minor  number  since  returning the original minor will result in post‐
       poned dynamic opens when original minor close() call occurs.

         *devp = makedevice(getmajor(*devp), new_minor);


RETURN VALUES
       The open() function should return 0 for success, or the appropriate er‐
       ror number.

SEE ALSO
       close(2), exit(2), mmap(2), mount(2), munmap(2),  open(2),  attach(9E),
       close(9E),    Intro(9E),    ddi_create_minor_node(9F),    getmajor(9F),
       getminor(9F), makedevice(9F), nulldev(9F), cb_ops(9S)


       Writing Device Drivers in Oracle Solaris 11.4


       STREAMS Programming Guide

WARNINGS
       Do not attempt to change the major number.


       When a driver modifies the device number passed in, it must not  change
       the  major  number  portion  of  the device number. Unless CLONEOPEN is
       specified, the modified device number must map to the same  driver  in‐
       stance  indicated  by the driver's getinfo(9e) implementation. In other
       words, cloning across  different  drivers  is  not  supported.  Cloning
       across  different instances of the same driver in only permitted if the
       driver specified in CLONE_DEV in ddi_create_minor_node(9F) is not  sup‐
       ported.

Oracle Solaris 11.4            9 September 2024                       open(9E)
맨 페이지 내용의 저작권은 맨 페이지 작성자에게 있습니다.
RSS ATOM XHTML 5 CSS3