Unix高级编程学习笔记(1)

内核(Kernel):控制计算机硬件资源,提供程序运行环境
系统调用(System Call):内核的接口
公用函数库:建立在系统调用接口之上
shell:命令行解释器

输入和输入:
1、文件描述符(File Descriptor):一个小的非负整数,内核用它标识一个特定进程正在访问的文件。
2、标准输入、输出、出错:当运行一个新程序是,shell为其打开三个文件描述符:stdin、stdout、stderr,默认都链向终端。
3、不用缓冲的I/O: 如open、read、write、lseek以及close函数
4、标准I/O:带缓冲的接口。如read函数读取读需要制定字节数,而fgets读一完整的行。

程序和进程:
1、程序:放在磁盘上、在某个目录中的一个可执行文件。使用6个exec函数之一来由内核将程序读入存储器并执行。
2、进程和进程ID:进程ID为非负整数
3、进程控制:fork、exec和waitpid
4、线程和线程ID:在一个进程内的所有线程共享同一地址空间、文件描述符、栈以及和进程相关的属性。在多线程访问共享数据时注意采取同步措施。

出错处理
整形变量errno在errno.h中定义 :extern int errno;
在多线程中,每个线程都有属于自己的局部errno变量。

C标准定义了两个函数帮助打印出错误信息

#include <string.h>
char *strerror(int errnum);
#include <stdio.h>
void perror(const char *msg);

输出msg字符串,加冒号,加对于error的信息

extern关键字
1. 在变量方面,如果你在aaa.c文件中声明了一个全局的变量,这个全局的变量如果要被其他的文件所引用,就用extern来声明。
2. extern在函数调用中的作用,如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。如果你不想包含头文件,那么在c/cpp中以extern方式声明该函数
3. 此外,extern修饰符可用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern“C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。

最后看一个示例程序

#include "apue.h"
#include <sys/wait.h>
#include "./myerr.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) {   // 创建一个子进程,子进程从这里开始执行,小于0,创建失败
            err_sys("fork error");
        } else if (pid == 0) {     // 如果返回值为0,表示在子进程,执行命令,然后退出进程
            execlp(buf, buf, (char*)0);
            err_ret("couldn't execute: %s", buf);
            exit(127);
        }

        // 父进程 :waitpid表暂时停止目前进程的执行,直到有信号来到或子进程结束
        if ((pid = waitpid(pid, &status, 0)) < 0)
            err_sys("waitpid error");

        printf("%% ");
    }
    exit(0);
} 

fork( ) 用法参考:
http://blog.csdn.net/jason314/article/details/5640969

你可能感兴趣的:(Unix高级编程学习笔记(1))