UNIX高级环境编程学习(四)---------------------基础知识

来源:互联网 发布:网络术语举铁什么意思 编辑:程序博客网 时间:2024/06/05 16:54

信号:

信号用于通知进程发生了某种情况。

三种信号处理方式;

1.忽略信号。有些表示硬件异常,例如除法运算除数为0,或者非法访问地址发生后果不确定,这种处理方式不推荐使用。

2.按系统默认方式处理。对于除数为0,系统默认是终止该进程。

3.提供一个函数,信号发生时调用该函数,即捕捉信号。在函数中自定义处理函数

键盘上有中断键(del/Ctrl+C)和退出键(Ctrl+\),用于中断当前运行的进程。另一种信号发生方式是kill函数,在一个进程中调用,就可以向另一个进程发送一个信号,但是我们需要是接收信号的进程的所有者或者是超级用户

例:

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

static void sig_int(int);

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


    if(signal(SIGINT,sig_int) == SIG_ERR)
    {
        err_sys("signal error");
    }

    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);
}

void sig_int(int signo)
{
    printf("interrupt\n%% ");
}

Ctrl+c会在终端打印信息


时间:

1.日历时间(UTC)

2.进程时间/CPU时间

进程时间以时钟滴答计算。系统基本数据类型time_t,

度量一个进程的执行时间,UNIX系统为一个进程维护了三个进程时间值

时钟时间

用户CPU时间

系统CPU时间

时钟时间又称墙上时钟时间,是进程运行的时间总量,其值与系统中同时运行的进程数有关。(注:本文提到的时钟时间,都是在系统中没有其他活动时进行度量)

用户CPU时间是执行用户指令所用的时间量。系统CPU时间是为该进程执行内核程序所经历的时间。例如,当一个进程执行一个系统服务时(如read/write),在内核内执行该服务所花费的时间就计入该进程的CPU时间。用户CPU时间和系统CPU时间之和常被称为CPU时间。

获取任意进程的时钟时间,用户时间,系统时间----------time(1),

time  -p grep _POSIX_SOURCE */*.h > /dev/null

time命令的输出格式与所使用的的shell有关,因为某些shell并不运行/user/bin/time,而时使用一个内置函数测量命令运行所使用的的时间。



系统调用和库函数

所有操作系统都提供多种服务的入口点,由此程序向内核请求服务。入口点即系统调用。

UNIX使用的技术是为每个系统调用在标准C库中设置一个具有同样名字的函数。用户进程用标准C调用序列来调用这些函数,然后,函数又用系统所要求的的技术调用相应的内核服务。(例如:函数可将一个或多个C参数送入通用寄存器,然后执行某个产生软中断进入内核的机器指令)

部分程序员可以使用的通用库函数。虽然这些函数可能会调用一个或多个内核的系统调用,但不是内核的接入点。例如printf会调用write系统调用以输出一个字符串,但是函数strcpy和atoi并不使用任何内核的系统调用。

从实现者的角度,系统调用和库函数之间有根本的区别,但从用户角度,并无区别。本文中系统调用和库函数都以C函数的形式出现,两者都为应用程序提供服务。但是,如果希望的话,我们可以替换库函数,但是系统调用通常是不能被替换的。

例如;存储空间分配函数malloc,有多种方法进行分配,回收,不存在对所有程序都最优的一种技术。UNIX系统调用中处理存储空间分配的是sbrk(2),它不是一个通用的存储器管理器。它按指定字节数增加或减少进程地址空间,如何管理地址空间取决于进程。

内核中的系统调用分配一块空间给进程,而库函数malloc则在用户层析管理这一空间。

即所谓系统调用和库函数的区别,又如,UNIX系统提供的判断当前时间和日期的借口。一些操作系统分别提供了一个返回时间和返回日期的系统调用。任何特殊的处理例如正常时制和夏令时之间的转换,由内核处理或要求人工干预。UNIX系统则补同它只提供一个系统调用(一个秒数),解读方式有人们自己定义。

应用程序可以调用系统调用也可以调用库函数。很多库函数会进行系统调用。即用户可以直接进行系统调用也可以通过调用库函数,由库函数进行系统调用。

另外,系统调用通常提供一种最小接口,而库函数通常提供比较复杂的功能。

例如进程控制系统调用(fork,exec,wait)通常由用户程序直接调用,而库函数(例如system,popen)则使用最基本的进程控制系统调用

0 0
原创粉丝点击