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)则使用最基本的进程控制系统调用
- UNIX高级环境编程学习(四)---------------------基础知识
- UNIX环境高级编程学习笔记(一)UNIX基础知识
- 一起学习unix环境高级编程--unix基础知识(1)
- Unix环境高级编程学习笔记(四) 进程环境
- unix高级环境编程学习(一) ---------------基础知识
- UNIX高级环境编程学习(三)----------------基础知识
- unix高级环境编程(二)-------------------基础知识
- 小佳弱弱学习——unix环境高级编程(四)
- 《Unix环境高级编程》 总结 (四)
- UNIX环境高级编程(第三版)学习笔记(一、UNIX基础知识)
- UNIX环境高级编程(1):UNIX基础知识(1)
- UNIX环境高级编程(第1章 UNIX基础知识)
- unix高级环境编程--unix基础知识
- 《UNIX环境高级编程》---1.UNIX基础知识
- 1.UNIX 环境高级编程--UNIX基础知识
- Unix环境高级编程 学习笔记_1_Unix 基础知识
- UNIX环境高级编程(学习笔记)
- UNIX环境高级编程-读书笔记-网络编程(四)
- missing required library: 'C:\Program Files\Java\jdk1.7.0_07\lib\tools.jar'
- 南阳理工acm 49开心的小明
- hibernate 常用注解
- 抓包工具Charles的5分钟新手指南
- Shell的一些关键字用法
- UNIX高级环境编程学习(四)---------------------基础知识
- Git的使用二:基本配置及拉取代码
- 剥离IOS库中不需要的架构平台部分
- 关于eclipse调试的问题老是调试不成功
- git stash
- C#之回车响应
- msql查询中报错 Unknown column '黄色水果' in 'where clause'
- Docker安装与基本操作(CentOS7)
- PRODUCT_CHARACTERISTICS 详解