APUE-学习记录-20200618

3次阅读

共计 1513 个字符,预计需要花费 4 分钟才能阅读完成。

1.5 输入和输出

1. 文件描述符

文件描述符通常是一个小的非负整数,内核用以标识一个特定进程正在访问的文件。当内核打开一个现有文件或创建一个新文件时,都返回一个文件描述符。在读写文件时,可以使用文件描述符。

2. 标准输入、标准输出和标准错误

每当运行一个新程序时,shell 都会为其打开 3 个文件描述符,即标准输入、标准输出和标准错误,这三个描述符都链接到终端。

3. 不带缓冲的 I /O

函数 open、read、write、lseek、close 提供了不带缓冲的 I /O,这些函数都使用文件描述符。

Page7 实例

#include "apue.h"

#define BUFFERSIZE 4096

int main(void)
{
    int n;
    char buf[BUFFERSIZE];

    while((n = read(STDIN_FILENO, buf, BUFFERSIZE)) > 0)
        if(write(STDOUT_FILENO, buf, n) != n)
            err_sys("write error");

    if (n < 0)
        err_sys("read error");

    exit(0);
}

说明:

  1. STDIN_FILENO 和 STDOUT_FILENO 定义在 unistd.h 中,指定了标准输入和标准输出的文件描述符。
  2. read 函数返回读取的字节数,此值用作要写的字节数。当到达输入文件末尾时,read 返回 0,程序停止。
  3. 调用方法:

    1. ./a.out > data
    2. ./a.out < infile > outfile

4. 标准 I /O

标准 I / O 为不带缓冲的 I / O 函数提供了带缓冲的接口。

Page8 实例

#include "apue.h"

int main(void)
{
    int c;
    while((c = getc(stdin)) != EOF)
        if(putc(c, stdout) == EOF)  // putc() returns EOF when error ocurrs
            err_sys("output error");

    if(ferror(stdin))
        err_sys("input error");

    exit(0);
}

1.6 程序和进程

1. 程序

程序是一个存储在磁盘上某个目录中的可执行文件,内核使用 exec 函数将程序度如内存,并执行程序。

2. 进程和进程 ID

程序的执行实例被称为进程,每一个进程都有一个唯一的数字标识符,称为进程 ID。进程 ID 是一个非负整数。

Page9 实例

#include "apue.h"

int main(void)
{printf("hello world from process ID %ld\n", (long)getpid());
    exit(0);
}

说明:使用 getpid 函数获取进程 ID。

3. 进程控制

进程控制的函数主要有 fork、exec、和 waitpid。

Page9 实例

#include "apue.h"
#include <sys/wait.h>

int main(void)
{char buf[MAXLINE];
    pid_t pid;
    int status;

    printf("%%");
    while(fgets(buf, MAXLINE, stdin) != NULL)
    {if(buf[strlen(buf) - 1] == '\n')
            buf[strlen (buf) - 1] = 0;

        if((pid = fork()) < 0)
        {err_sys("fork error");
        }
        else if (pid == 0)
        {execlp(buf, buf, (char *)0);
            err_ret("couldn't execute: %s", buf);
            exit(127);
        }

        if((pid = waitpid(pid, &status, 0)) < 0)
            err_sys("waitpid error");
        printf("%%");
    }
    exit(0);
}
正文完
 0