Advanced Programming in the UNIX Environment: Second Edition [Electronic resources] نسخه متنی

اینجــــا یک کتابخانه دیجیتالی است

با بیش از 100000 منبع الکترونیکی رایگان به زبان فارسی ، عربی و انگلیسی

Advanced Programming in the UNIX Environment: Second Edition [Electronic resources] - نسخه متنی

W. Richard Stevens; Stephen A. Rago

| نمايش فراداده ، افزودن یک نقد و بررسی
افزودن به کتابخانه شخصی
ارسال به دوستان
جستجو در متن کتاب
بیشتر
تنظیمات قلم

فونت

اندازه قلم

+ - پیش فرض

حالت نمایش

روز نیمروز شب
جستجو در لغت نامه
بیشتر
لیست موضوعات
توضیحات
افزودن یادداشت جدید



1.6. Programs and Processes



Program


A

program is an executable file residing on disk in a directory. A program is read into memory and is executed by the kernel as a result of one of the six exec functions. We'll cover these functions in Section 8.10.


Processes and Process ID


An executing instance of a program is called a

process , a term used on almost every page of this text. Some operating systems use the term

task to refer to a program that is being executed.

The UNIX System guarantees that every process has a unique numeric identifier called the

process ID . The process ID is always a non-negative integer.


Example

The program in Figure 1.6 prints its process ID.

If we compile this program into the file a.out and execute it, we have

$

./a.out
hello world from process ID 851
$

./a.out
hello world from process ID 854

When this program runs, it calls the function getpid to obtain its process ID.


Figure 1.6. Print the process ID

#include "apue.h"
int
main(void)
{
printf("hello world from process ID %d\n", getpid());
exit(0);
}


Process Control


There are three primary functions for process control: fork, exec, and waitpid. (The exec function has six variants, but we often refer to them collectively as simply the exec function.)


Example

The process control features of the UNIX System are demonstrated using a simple program (Chapter 18, we describe all the special terminal charactersend of file, backspace one character, erase entire line, and so onand how to change them.

  • Because each line returned by fgets is terminated with a newline character, followed by a null byte, we use the standard C function strlen to calculate the length of the string, and then replace the newline with a null byte. We do this because the execlp function wants a null-terminated argument, not a newline-terminated argument.

  • We call fork to create a new process, which is a copy of the caller. We say that the caller is the parent and that the newly created process is the child. Then fork returns the non-negative process ID of the new child process to the parent, and returns 0 to the child. Because fork creates a new process, we say that it is called onceby the parentbut returns twicein the parent and in the child.

  • In the child, we call execlp to execute the command that was read from the standard input. This replaces the child process with the new program file. The combination of a fork, followed by an exec, is what some operating systems call spawning a new process. In the UNIX System, the two parts are separated into individual functions. We'll have a lot more to say about these functions in Chapter 8.

  • Because the child calls execlp to execute the new program file, the parent wants to wait for the child to terminate. This is done by calling waitpid, specifying which process we want to wait for: the pid argument, which is the process ID of the child. The waitpid function also returns the termination status of the childthe status variablebut in this simple program, we don't do anything with this value. We could examine it to determine exactly how the child terminated.

  • The most fundamental limitation of this program is that we can't pass arguments to the command that we execute. We can't, for example, specify the name of a directory to list. We can execute ls only on the working directory. To allow arguments would require that we parse the input line, separating the arguments by some convention, probably spaces or tabs, and then pass each argument as a separate argument to the execlp function. Nevertheless, this program is still a useful demonstration of the process control functions of the UNIX System.


  • If we run this program, we get the following results. Note that our program has a different promptthe percent signto distinguish it from the shell's prompt.

    $

    ./a.out
    %

    date
    Sun Aug 1 03:04:47 EDT 2004

    programmers work late
    %

    who
    sar :0 Jul 26 22:54
    sar pts/0 Jul 26 22:54 (:0)
    sar pts/1 Jul 26 22:54 (:0)
    sar pts/2 Jul 26 22:54 (:0)
    %

    pwd
    /home/sar/bk/apue/2e
    %

    ls
    Makefile
    a.out
    shell1.c
    %

    ^D

    type the end-of-file character
    $

    the regular shell prompt


    Figure 1.7. Read commands from standard input and execute them

    #include "apue.h"
    #include <sys/wait.h>
    int
    main(void)
    {
    char buf[MAXLINE]; /* from apue.h */
    pid_t pid;
    int status;
    printf("%% "); /* print prompt (printf requires %% to print %) */
    while (fgets(buf, MAXLINE, stdin) != NULL) {
    if (buf[strlen(buf) - 1] == "\n")
    buf[strlen(buf) - 1] = 0; /* replace newline with null */
    if ((pid = fork()) < 0) {
    err_sys("fork error");
    } else if (pid == 0) { /* child */
    execlp(buf, buf, (char *)0);
    err_ret("couldn't execute: %s", buf);
    exit(127);
    }
    /* parent */
    if ((pid = waitpid(pid, &status, 0)) < 0)
    err_sys("waitpid error");
    printf("%% ");
    }
    exit(0);
    }

    The notation ^D is used to indicate a control character. Control characters are special characters formed by holding down the control keyoften labeled Control or Ctrlon your keyboard and then pressing another key at the same time. Control-D, or ^D, is the default end-of-file character. We'll see many more control characters when we discuss terminal I/O in Chapter 18.


    Threads and Thread IDs


    Usually, a process has only one thread of controlone set of machine instructions executing at a time. Some problems are easier to solve when more than one thread of control can operate on different parts of the problem. Additionally, multiple threads of control can exploit the parallelism possible on multiprocessor systems.

    Chapter 12.


      / 369