寒假学习 第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 高级编程)相关推荐

  1. 西工大java高级网络编程_西工大16春《JAVA高级网络编程》平时作业

    西工大16春<JAVA高级网络编程>平时作业 7 o& [9 w  ^# D  Z一.单选题:[25道,总分:100分]5 z# ?* Z! M% M1 h4 R# n. D+ a ...

  2. linux软件安装管理ppt,学习情境3 安装管理linux软件.ppt

    学习情境3 安装管理linux软件.ppt 学习情境3 安装管理linux软件 压缩解压 为什么要压缩: 节约空间 打包 软件下载/安装 压缩解压 常见文件后缀名: *.Z compress程序的压缩 ...

  3. Linux学习总结(17)——Linux新手必须学会的12个命令

    今天的用户可以根据自己的意愿选择是否使用作为Linux象征的命令行,确切的证明了Linux已经有了很大的发展.现在很多Linux发行版的图形用户界面已经非常强大,不再需要命令行. 但是命令行在Linu ...

  4. android xml java混合编程_Java学习中注解与多线程,网络编程与XML技术

    本部分内容主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术.初次学习这部分会感觉很难,主要是概念难于理解,最好是多看看例子,多练习.下面是个人的总结 拉勾IT课小编为大 ...

  5. C语言编程规范学习笔记和总结(附华为编程规范机试参考试题)

    目录 规范说明 一.头文件 原则1.1 头文件中适合放置接口的声明,不适合放置实现. 原则1.2 头文件应当职责单一 原则1.3 头文件应向稳定的方向包含 规则1.1 每一个.c文件应有一个同名.h文 ...

  6. linux查看riak版本,Riak学习(一):Linux Centos 下安装 Riak 服务

    Riak学习(1):Linux Centos 下安装 Riak 服务 1,介绍 8月底参加了CSND的一个技术沙龙. http://huiyi.csdn.net/meeting/info/437/cl ...

  7. 并发编程(1)学习攻略如何才能学好并发编程?

    并发编程并不是一门相对独立的学科,而是一个综合学科.并发编程相关的概念和技术看上非常零散,相关度也很低,总给你一种这样的感觉:我已经学习很多相关技术了,可还是搞不定并发编程.那如何才能学习好并发编程呢 ...

  8. Go 分布式学习利器(17)-- Go并发编程之协程机制:Grountine 原理及使用

    文章目录 1. Thread VS Groutine 2. Groutine 调度原理 3. Groutine 示例代码 关于Go的底层实现还需要后续持续研究,文中如有一些原理描述有误,欢迎指证. 1 ...

  9. linux查看riak版本,Riak学习(1):Linux Centos 下安装 Riak 服务

    1,介绍 8月底参加了CSND的一个技术沙龙. http://huiyi.csdn.net/meeting/info/437/cloud 书生网的cto金友兵,分享了下他们的nosql,他们经过对比分 ...

最新文章

  1. 2021北师大丰台实验高考成绩查询,2020北京丰台区中考各高中录取分数线公布
  2. redis的安装以及常见运用场景
  3. 基于React Native和Ethers.js的电子钱包(三):Ethers.js
  4. 如何在Windows 10中创建电源选项快捷图标,快速设置笔记本电脑的节能模式
  5. 【MyBiatis框架】原生态Jdbc的弊端已经Mybatis简介
  6. 【Elasticsearch】Elasticsearch 缓存策略 QueryCacheingPolicy
  7. 有关计算机程序的论文,有关计算机程序的论文范文.doc
  8. 地图标识符号大全_创意游戏小程序大全:胡建土楼游戏!带你领略不一样的创意小游戏...
  9. 2019年春节加班机暴增 人潮多考验桃园机场准点率
  10. 现代通信原理2.5:确定信号的能量谱密度、功率谱密度与自相关函数
  11. easyrecovery15新版绿色序列号数据恢复软件
  12. LeetCode 到最近的人的最大距离
  13. excel筛选,排序
  14. java下雪_下雪屏保java,基础
  15. 药店管理系统|数据库设计
  16. 典型ASIC设计流程
  17. 齿轮故障诊断数据集分享(包括轴承和齿轮)
  18. 基于C++的俄罗斯方块游戏的开发与设计
  19. 怎么将图片镜面对称_镜面对称怎么拍 让摄影创意无限延伸
  20. 用简易方法证明 n 个数的算术平均数 > 几何平均数

热门文章

  1. CVPR2020:4D点云语义分割网络(SpSequenceNet)
  2. 各种光学仪器成像技术(上)
  3. 可视化反投射:坍塌尺寸的概率恢复:ICCV9论文解读
  4. 使用IDEA开发Servlet程序
  5. Android 属性动画(Property Animation) ValueAnimator 的介绍
  6. JAVA中获取当前系统时间
  7. tp5+workman
  8. python编程小提示
  9. wampserver下升级php7
  10. Spring中配置DataSource数据源的几种选择