Fundamentals - PowerPoint PPT Presentation

About This Presentation
Title:

Fundamentals

Description:

Fundamentals CIS 552 – PowerPoint PPT presentation

Number of Views:39
Avg rating:3.0/5.0
Slides: 28
Provided by: kut69
Category:

less

Transcript and Presenter's Notes

Title: Fundamentals


1
Fundamentals
  • CIS 552

2
Fundamentals
  • Low-level I/O (read/write using system calls)
  • Opening/Creating files
  • Reading Writing files
  • Moving around in files
  • file descriptors
  • Program Creation and Execution
  • exec family of system calls
  • using fork() to create processes
  • exiting processes
  • process termination

3
Low-level I/O
  • Unix System Calls can be used to
  • Open/Create Files
  • Read Write files
  • Move around in files
  • System calls work with file descriptors
  • A file descriptor is an int that represents a
    file/device
  • File descriptors are allocated by the system
  • Limited number of file descriptors available
  • 0 is stdin, 1 is stdout, 2 is stderr these are
    automatically allocated and opened when a program
    begins

4
Opening/Creating Files
  • open(ltfile/device namegt,lthow to opengt,ltmodegt)
  • ltfile/device namegt is a C-string, exactly as in
    the C fstream member function open()
  • lthow to opengt is an int, usually specified with a
    constant defined in fcntl.h. The values may be
    combined using a logical OR ( ), allowing every
    possible way of opening a file (examples on next
    slide)
  • Detail on this appears on the next slide
  • ltmodegt is an optional third argument that is
    specified only if the file is created. It is a
    three digit octal number representing the
    permissions to be set on the file.
  • a file descriptor (of type int) is returned on
    success otherwise 1 is returned.

5
Specifying How a File is to be OpenedFile Access
  • You must specify how the file is to be accessed.
    Exactly one of these values must appear in the
    2nd argument of open()
  • O_RDONLY
  • The file is opened for reading only. If the file
    doesnt exist, and the create option (next slide)
    isnt specified, open() will fail (note that it
    is not ordinary to open a file to be read with
    the create option specified)
  • O_WRONLY
  • The file is to be opened for writing only. If the
    file doesnt exist, and the create option is not
    specified, or if the file does exist, and the
    create option is specified along with the fail if
    file exists option, open() will fail.
  • O_RDWR
  • The file is opened for full access. Errors
    specified above can occur, however.
  • If none of these are specified, open() can
    succeed, but nothing can be done to the file.
    (See open2.c in the demo directory)

6
Specifying How a File is to be OpenedFile
Opening Options
  • The following are used to further specify how a
    file is opened. They are combined with the access
    and possibly each other
  • O_APPEND
  • all access is at end of file
  • O_CREAT
  • create file if it doesnt exist (does not cause
    failure if file exists). Use a third argument to
    specify mode.
  • O_TRUNC
  • Destroy the existing contents of the file, if it
    exists.
  • O_EXCL
  • When combined with O_CREAT, causes open() to fail
    if the file already exists.

7
Specifying How a File is to be OpenedExercises/Ex
amples
  • Open a file named abc.txt for writing, only if it
    exists. If it does, the present contents should
    be preserved, and writing should occur after the
    present contents.
  • Give an open() command equivalent to the C
    command Dest.open(abc.txt), where Dest is an
    ofstream
  • Give an open command that opens a file abc.txt
    for writing only if it doesnt already exist.
  • Give command(s), to open a file abc.txt for
    writing. If abc.txt exists, the user should be
    prompted, and then the file opened for writing
    only if the user answers affirmatively to a
    prompt to overwrite the file. Otherwise, the file
    is created.
  • Repeat the previous exercise, using C

8
Low-level Reading and Writing
  • Using low-level (system) calls, I/O can only be
    accomplished via a buffer, whose size is
    determined by the user.
  • small buffer requires more device accesses,
    slowing program some systems override with their
    own buffer
  • Commands
  • read(ltfile descriptorgt,ltaddress of buffergt,lt
    bytes to readgt)
  • write(ltfile descriptorgt,ltaddress of buffergt,lt
    bytes to readgt)
  • value returned is bytes read 0 gt eof (read
    only), -1 gt error

9
Moving Around in A File Low-level access via
File Descriptor
  • lseek(ltfile descriptorgt,ltamountgt,ltrelativitygt)
  • where
  • ltfile descriptorgt is a file descriptor of an open
    file
  • ltamountgt is the number of bytes to move the file
    descriptor...
  • ltrelativitygt is the point from which the
    operation takes place
  • SEEK_SET (0) is start of file
  • SEEK_CUR (1) is current position
  • SEEK_END (2) is end of file
  • if ltamountgt is positive with this option, there
    will be a hole in the file.
  • the return value is the new offset in the file

10
Exercises
  • Give an lseek() command to find the present
    offset in a file
  • How is the present offset in a file found when
    the file is accessed via a file pointer?
  • Give a loop to write the values 1-100 in the same
    spot of a text file.
  • Why is the seek command basically worthless in a
    text file, except to go to the beginning or end
    of the file?

11
Program Creation and Execution
  • exec family of system calls
  • using fork() to create processes
  • process termination
  • waiting for processes

12
exec Family of System Calls
  • Execute a program using one of the exec calls
  • Six exec functions
  • Can provide a list and have function build argv
    vector or provide the vector itself
  • Can specify path to program or use path variable
    to find it
  • Can use present environment, or specify new
    environment
  • environment defined by setenv items. Type set at
    Unix prompt to see environment
  • called program occupies environment of caller
    (takes its pid, as new process isnt created).
    Only replaces text, data, heap, and stack
    segments of caller of exec
  • execs are the only function calls that dont
    return

13
execl execv
  • execl
  • give pathname to file (incl. name) as 1st
    argument
  • Follow with list of command line arguments
    executable 1st
  • this list is used to build the argv vector passed
    to the called program
  • executable name is in argv0
  • last argument must be null char
  • execv
  • give pathname to file (incl. name) as 1st
    argument
  • Follow with null-terminated argv vector

14
execlp execvp
  • execlp
  • give filename as 1st argument path environment
    variable is used to find executable
  • Follow with list of command line arguments
    executable 1st
  • this list is used to build the argv vector passed
    to the called program
  • last argument must be null char
  • execvp
  • give filename as 1st argument path used
  • Follow with null-terminated argv vector

15
Exercise
  • Suppose a program X is executed whose purpose is
    to call another program Y whose name and
    command-line arguments are passed in to X as
    command-line arguments.
  • Write an execlp and an execvp command, as they
    would appear in X, to execute Y.
  • What problem could arise if we choose to use
    execl or execv?

16
Process Creationfork vfork
  • Processes can only be created using a fork
    command
  • fork is called once, but returns twice
  • parent calls fork, value is returned to each of
    parent and child
  • created process is called the child
  • existing process is the parent
  • Process identifier (pid) is used to distinguish
    between parent and child
  • Every process has a unique pid in the system

17
fork
  • Called once, returns twice return type is pid_t,
    unsigned int type for pids
  • Parent receives childs pid as return value of
    fork
  • child receives 0 as return value from fork
  • Order of execution depends on scheduling
    algorithm of system.
  • Order can be controlled important if there is
    dependence between parent and child
  • Child and parent execute in their own
    environments
  • Child gets copy of parents environment
    (including data space) as it is at time of fork
  • If parent has file open, child gets copy of file
    pointers or descriptors
  • If parents stdout (cout) is redirected before
    fork, child output to stdout is also redirected

18
Child Process Inheritance
  • user id, group id
  • controlling terminal
  • current working directory
  • root directory
  • file mode creation mask
  • signal mask (later) and dispositions
  • close-on-exec flag for open file descriptors
  • environment
  • attached shared memory segments
  • resource limits

19
Items That DistinguishParent From Child
  • Return value from fork
  • unique pid
  • different parent pid (ppid)
  • childs ppid is the parents pid
  • parents pid stays same
  • certain time values reset in child
  • parents file locks arent inherited
  • pending alarms are not inherited
  • pending signals in parent arent inherited

20
vfork
  • Maintained for compatability, vfork is not often
    used
  • Some systems implement it as a fork
  • Child executes first. Parent doesnt resume until
    child either exits (via call of exit() or
    _exit()) or uses exec to start another program.
  • The child is a separate process, but it shares
    the parents data space. vforkdemo.c shows that
    this is the case

21
vforkdemo.c
  • include ltstdio.hgt
  • include ltsys/types.hgt
  • include ltunistd.hgt
  • int glob
  • int
  • main(void)
  • int var
  • pid_t pid
  • glob 10 var 20
  • printf("before vfork\n")
  • if (vfork() 0 )
  • sleep(1)
  • glob
  • var
  • printf("child glob d var d\n", glob,
    var)
  • _exit(0) // what if this is just exit()?
  • Parent output is same as childs
  • If separate data spaces, parent wouldnt
    experience operations

22
When a process terminates...
  • Its parent is informed via a SIGCHLD signal
  • If its parent doesnt collect it, it becomes a
    zombie process (next slide)
  • If its parent has already terminated, it is
    inherited by the init process (pid 1), which
    collects it using a wait operation (2 slides
    hence).
  • All processes must have an identifiable (by pid)
    parent
  • It is able to provide minimal information to its
    parent when it comes to collect it

23
Zombie Process
  • A zombie is a process that has terminated, but
    hasnt been collected by its parent
  • The system frees most of the resources associated
    with this terminated process, e.g. closing open
    files and freeing memory,and minimally
    maintains
  • process id
  • CPU time used
  • termination status

24
wait operations
  • A terminated process information is collected
    via a call of a wait operation by its parent
  • Operations
  • wait
  • blocks the calling process until a child process
    terminates, returning the childs pid.
  • If caller has no children, wait immediately
    returns 1 (error)
  • the termination status (return value) of the
    child may be obtained via the argument
  • waitpid
  • permits a caller to wait for a particular child,
    identified by its pid
  • can be configured to not block if the child is
    active

25
Process Termination
  • Normal
  • main contains return statement
  • call exit
  • call _exit
  • Abnormal
  • Process aborts itself
  • Process receives a signal (e.g. division by 0)

26
exit() vs._exit()
  • exit() causes a process to terminate.
  • stdio funtion fclose is applied to all open
    streams
  • the argument is the exit status
  • exit status becomes termination status when
    exit() calls _exit()
  • _exit is a Unix specific command
  • the process terminates immediately without any
    cleanup
  • see vfork examples
  • If a process doesnt explicitly specify exit
    status via a call to exit() or _exit(), the
    process termination status will be undefined

27
Exercises
  1. What can happen if a process calls exit while
    writing to a buffered output stream?
  2. Write code guaranteed to create a zombie process.
  3. Write code that will cause a process to be
    inherited by the init process.
Write a Comment
User Comments (0)
About PowerShow.com