linux web高级编程,寒假学习 第16.17天 (linux 高级编程)
寒假学习 第16.17天 (linux 高级编程) 笔记 总结
一、进程的基本控制(进程的同步)
1.进程的常见控制函数
pause sleep/usleep
atexit on_exit
int atexit(void (*function)(void)); //注册终止函数(即main执行结束后调用的函数)
int on_exit(void (*function)(int , void *), void *arg); //跟atexit差不多,只不过函数可以带参数
#include
#include
#include
void fun()
{
printf("over!\n");
}
int main(int argc, const char *argv[])
{
atexit(fun); //注册,
printf("Processs!\n");
return 0;
}
2.进程与文件锁(锁有共享锁跟强制锁,内核编译不同)
多进程下面文件的读写是共享的。
怎么知道一个文件正在被另外进程读写?
就是要使用文件锁。
API:
fcntl (文件锁受内核参数影响)
对文件加锁
int fcntl(int fd, int cmd, ... /* arg */ );
返回0加锁成功,-1加锁失败。
fd 加锁的文件符号
cmd 锁的操作方式 F_SETLK(如果已经加锁就异常返回) F_UNLK F_SETLCKW(已经加锁,者、则阻塞等待等到解锁)
... struct flock* 类型
struct flock {
...
short l_type; /* Type of lock: F_RDLCK,
F_WRLCK, F_UNLCK */
short l_whence; /* How to interpret l_start:
SEEK_SET, SEEK_CUR, SEEK_END */
off_t l_start; /* Starting offset for lock */
off_t l_len; /* Number of bytes to lock */
pid_t l_pid; /* PID of process blocking our lock
(F_GETLK only) */
...
};
例子:
setlock.c
#include
#include
#include
#include
int main(int argc, const char *argv[])
{
int fd;
struct flock lk;
int r;
fd=open("test.txt",O_RDWR);
if(fd==-1) printf("error:%m\n"),exit(-1);
lk.l_type=F_WRLCK;
lk.l_whence=SEEK_SET;
lk.l_start=5;
lk.l_len=10;
r=fcntl(fd,F_SETLK,&lk);
if(r==0)
printf("加锁成功!\n");
else
printf("加锁失败!\n");
while(1);
return 0;
}
getlock.c
#include
#include
#include
#include
int main(int argc, const char *argv[])
{
int fd;
struct flock lk={0}; //一定要初始化0
int r;
fd=open("test.txt",O_RDWR);
if(fd==-1) printf("error:%m\n"),exit(-1);
r=fcntl(fd,F_GETLK,&lk);
if(lk.l_type=F_WRLCK){
printf("写锁!\n");
}
printf("pid:%d,start:%d, len:%d\n",r,lk.l_pid,lk.l_start,lk.l_len);
return 0;
}
锁也是一个进程可以共享的信息
二、信号
1.信号的作用
流程:
信号发给操作系统,操作系统查找这个信号是否注册,如果注册系统就调用函数
没有注册则采用缺省处理(一般是调用打印信号提示,并终止程序)
为了解决进程之间通信难。
作用:通知其他进程响应。(其实就是进程之间一种通信机制)
一般接受信号的进程会马上停止(软中断),并且调用信号的处理函数(默认的处理函数,或者用户的处理函数)。
例子:
2.信号的发送与安装
kill -s 信号 进程ID //向指定的进程发送信号
kill -l //可以看所有的信号 ctrl+D 就相当于发送信号2(即SIGINT)
例子:
#include
#include
#include
void handle(int s)
{
printf("信息发生\n");
}
int main(int argc, const char *argv[])
{
signal(SIGINT,handle); //注册信号
while(1)
{
printf("进程在执行!\n");
sleep(1);
}
return 0;
}当kill -s 2 pid 时(或直接ctrl+C)就会输出 “信号发送”
其中 SIGKILL与 SIGSTOP信号是不能被处理的
int kill(pid_t pid, int sig); //发送信号
pid:如果>0 发送到指定进程
如果=0 发送信号到该进程所在进程组的所有进程
如果=-1 发送给除init (1)之外的所有进程
如果<0 发送给指定的进程组(组ID就是 它的绝对值)
例子:
#include
#include
#include
int main(int argc, const char *argv[])
{
while(1)
{
kill(4184,SIGINT);
sleep(2);
}
return 0;
}
3.信号的应用(实现多任务)
延时器 timeout
信号:SIGALRM
信号发送函数:unsigned int alarm(unsigned int seconds); //自向本进程发出
例子:
#include
#include
void deal(int s)
{
printf("起床!\n");
}
int main(int argc, const char *argv[])
{
signal(SIGALRM,deal);
alarm(5);
while(1)
{
printf("AAAAA\n");
sleep(1);
}
return 0;
}
定时器
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, //计时方式 ITIMER_REAL真实时间 ITIMER_VIRTUAL程序暂用cpu的时间 ITIMER_PROF 进程跟系统的混合时间
const struct itimerval *new_value, //定时器的时间参数
struct itimerval *old_value); //返回原来设置的定时器,如果NULL 者不返回。
(set interval timter)
struct itimerval {
struct timeval it_interval;// 延时时间
struct timeval it_value; //间隔时间
};
struct timeval {
time_t tv_sec; //秒
suseconds_t tv_usec; //毫秒
};
例子:
#include
#include
#include
void deal(int s)
{
printf("起床!\n");
}
int main(int argc, const char *argv[])
{
struct itimerval val={0};
signal(SIGALRM,deal);
val.it_value.tv_sec=3; //sec跟usec都为0的表无穷时间,不会触发
val.it_interval.tv_sec=1;
setitimer(ITIMER_REAL,&val,0);
while(1)
{
printf("AAAAA\n");
sleep(1);
}
return 0;
}3秒钟过后每隔1秒钟显示 “起床了”。
http://www.dengb.com/ASPjc/729417.htmlwww.dengb.comtruehttp://www.dengb.com/ASPjc/729417.htmlTechArticle寒假学习 第16.17天 (linux 高级编程) 笔记 总结 一、进程的基本控制(进程的同步) 1.进程的常见控制函数 pause sleep/usleep atexit on_exit int...
linux web高级编程,寒假学习 第16.17天 (linux 高级编程)相关推荐
- 西工大java高级网络编程_西工大16春《JAVA高级网络编程》平时作业
西工大16春<JAVA高级网络编程>平时作业 7 o& [9 w ^# D Z一.单选题:[25道,总分:100分]5 z# ?* Z! M% M1 h4 R# n. D+ a ...
- linux软件安装管理ppt,学习情境3 安装管理linux软件.ppt
学习情境3 安装管理linux软件.ppt 学习情境3 安装管理linux软件 压缩解压 为什么要压缩: 节约空间 打包 软件下载/安装 压缩解压 常见文件后缀名: *.Z compress程序的压缩 ...
- Linux学习总结(17)——Linux新手必须学会的12个命令
今天的用户可以根据自己的意愿选择是否使用作为Linux象征的命令行,确切的证明了Linux已经有了很大的发展.现在很多Linux发行版的图形用户界面已经非常强大,不再需要命令行. 但是命令行在Linu ...
- android xml java混合编程_Java学习中注解与多线程,网络编程与XML技术
本部分内容主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术.初次学习这部分会感觉很难,主要是概念难于理解,最好是多看看例子,多练习.下面是个人的总结 拉勾IT课小编为大 ...
- C语言编程规范学习笔记和总结(附华为编程规范机试参考试题)
目录 规范说明 一.头文件 原则1.1 头文件中适合放置接口的声明,不适合放置实现. 原则1.2 头文件应当职责单一 原则1.3 头文件应向稳定的方向包含 规则1.1 每一个.c文件应有一个同名.h文 ...
- linux查看riak版本,Riak学习(一):Linux Centos 下安装 Riak 服务
Riak学习(1):Linux Centos 下安装 Riak 服务 1,介绍 8月底参加了CSND的一个技术沙龙. http://huiyi.csdn.net/meeting/info/437/cl ...
- 并发编程(1)学习攻略如何才能学好并发编程?
并发编程并不是一门相对独立的学科,而是一个综合学科.并发编程相关的概念和技术看上非常零散,相关度也很低,总给你一种这样的感觉:我已经学习很多相关技术了,可还是搞不定并发编程.那如何才能学习好并发编程呢 ...
- Go 分布式学习利器(17)-- Go并发编程之协程机制:Grountine 原理及使用
文章目录 1. Thread VS Groutine 2. Groutine 调度原理 3. Groutine 示例代码 关于Go的底层实现还需要后续持续研究,文中如有一些原理描述有误,欢迎指证. 1 ...
- linux查看riak版本,Riak学习(1):Linux Centos 下安装 Riak 服务
1,介绍 8月底参加了CSND的一个技术沙龙. http://huiyi.csdn.net/meeting/info/437/cloud 书生网的cto金友兵,分享了下他们的nosql,他们经过对比分 ...
最新文章
- 2021北师大丰台实验高考成绩查询,2020北京丰台区中考各高中录取分数线公布
- redis的安装以及常见运用场景
- 基于React Native和Ethers.js的电子钱包(三):Ethers.js
- 如何在Windows 10中创建电源选项快捷图标,快速设置笔记本电脑的节能模式
- 【MyBiatis框架】原生态Jdbc的弊端已经Mybatis简介
- 【Elasticsearch】Elasticsearch 缓存策略 QueryCacheingPolicy
- 有关计算机程序的论文,有关计算机程序的论文范文.doc
- 地图标识符号大全_创意游戏小程序大全:胡建土楼游戏!带你领略不一样的创意小游戏...
- 2019年春节加班机暴增 人潮多考验桃园机场准点率
- 现代通信原理2.5:确定信号的能量谱密度、功率谱密度与自相关函数
- easyrecovery15新版绿色序列号数据恢复软件
- LeetCode 到最近的人的最大距离
- excel筛选,排序
- java下雪_下雪屏保java,基础
- 药店管理系统|数据库设计
- 典型ASIC设计流程
- 齿轮故障诊断数据集分享(包括轴承和齿轮)
- 基于C++的俄罗斯方块游戏的开发与设计
- 怎么将图片镜面对称_镜面对称怎么拍 让摄影创意无限延伸
- 用简易方法证明 n 个数的算术平均数 > 几何平均数