第一章 UNIX基础知识

来源:互联网 发布:上市公司网络投票规则 编辑:程序博客网 时间:2024/06/05 11:58

unix体系结构:

第一章 UNIX基础知识 - night person - 夜归人

      内核的接口称为系统调用,公用函数库构建在系统调用接口之上,应用软件既可以调用公用函数库,也可以调用系统调用。shell是一种特殊的应用程序,它为运行其他应用程序提供了一个接口。
 
 
列出一个目录中所有的文件
#include "apue.h"
#include <dirent.h>
int
main(int argc, char *argv[])
{
    DIR             *dp;
    struct dirent   *dirp;
    if (argc != 2)
        err_quit("usage: ls directory_name");
    if ((dp = opendir(argv[1])) == NULL)
        err_sys("can't open %s", argv[1]);
    while ((dirp = readdir(dp)) != NULL)
        printf("%s\n", dirp->d_name);
    closedir(dp);
    exit(0);
}
 
 
1.输入和输出   文件描述符通常是一个小的非负整数,内核用它标识一个特定进程正在访问的文件。当内核打开一个已有文件和新文件时,它返回一个文件描述符。在读写文件时,就可以使用它。

 2.标准输入,输出和出错(略)

 3.不用缓冲的IO:函数open,read,write,lseek以及close提供了不用缓冲的IO。这些函数都使用文件描述符

 

eg:将标准输入复制到标准输出

#include "apue.h"
#define BUFFSIZE    4096
int
main(void)
{
    int     n;
    char    buf[BUFFSIZE];
    while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
        if (write(STDOUT_FILENO, buf, n) != n)
            err_sys("write error");
        if (n < 0)
            err_sys("read error");
        exit(0);
}
说明:STDIN_FILENO,STDOUT_FILENO在unistd.h中, 
可以复制任意普通的文件。
 
 
eg:将标准输入复制到标准输出2
int main(void)
{
    int     c;
    while ((c = getc(stdin)) != EOF)
        if (putc(c, stdout) == EOF)
            err_sys("output error");
    if (ferror(stdin))
        err_sys("input error");
    exit(0);
}
说明: stdout, stdin ,EOF在头文件 stdio.h中
 
 
 
程序和进程:
1.程序:程序是存放在磁盘上,处于目录中的一个可执行文件。使用 6个exec函数中的一个由内核将程序读入存储器,并执行。
2.进程.(略)
3.进程控制:
 三个进程控制主要函数:fork,exec 和 waitpid。
eg:从标准输入读入命令并执行。
 
#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);
}

 

 

 

4.线程和线程ID(略)

 

 

5.出错处理:

当unix函数出错时,常常返回一个负值,而且整型变量errno通常被设置为含有附加信息的一个值。

对于errno应当知道两条规则:第一条规则:如果没有出错,则其值不会被一个例程清除。因此,仅当函数的返回值指明出错时,才检验其值。 第二条是:任一函数都不会将errno值设置为0,在<errno.h>中定义的所有常量都不为0.

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

#include <string.h>

char * strerror(int errnum);  返回值:指向消息字符串的指针

 

perror函数基于errno的当前值,在标准出错上产生一条出错信息,然后返回

#include <stdio.h>

void perror(const char * msg)

它首先输出由msg指向的字符串,然后是一个冒号,一个空格,紧接着是对应于errno值的出错的信息,最后是一个换行符。

eg:

#include "apue.h"
#include <errno.h>

int main(int argc, char *argv[])
{
    fprintf(stderr, "EACCES: %s\n", strerror(EACCES));
    errno = ENOENT;
    perror(argv[0]);
    exit(0);
}

 

 

6.用户标识符

#include "apue.h"
int main(void)
{
    printf("uid = %d, gid = %d\n", getuid(), getgid());
    exit(0);
}

 

7.信号

当向一个进程发送信号时,我们必须是该进程的所有者超级用户

 

8 时间值

长期以来,linux有两种不同的时间值

日历时间:该值是1970年1月1日00:00:00以来国际标准时间(UTC)所经过的秒数累计值,这些时间值可用来记录文件最近一次的修改时间等。系统基本数据类型time_t用来保存这种时间值

进程时间:也被称为CPU时间,进程时间以时间滴答来计算。历史上曾经每秒钟为50,60,100个滴答。系统基本数据类型clock_t用于保存这种时间值。可以用sysconf 函数获得每秒钟的滴答数

当度量一个进程的执行时间,UNIX系统使用三个进程时间值:时钟时间 用户CPU时间 系统CPU时间

 

 

9.系统调用和库函数区别和联系(略)

 

 


 

0 0
原创粉丝点击