本来这篇文章是晚饭前要发表的,想完整的把system()函数和Linux系统上的信号梳理清晰,不料傍晚有点事情离开了一会儿,回来后又在楼下换了个新发型,耽误了好多时间,回来时已经是11点了。迅速洗澡洗衣服,把中午写到一段落的这篇文章发表出来:这是2018年最后1篇博文,先把system()基础梳理清晰,然后2019的第1篇文章就继续system()和信号的关系。

匆匆2018年就这样要过去了,如果要为这消逝的365天加以概括,我觉得平平淡淡吧,无惊喜也无意外。工作上能够做自己意向的Linux C/C++开发且技术上能循序渐进;生活中能分担家里经济负担,供妹妹上大学后,自己衣食住行不愁。这也是亲戚朋友眼中的我。

事实上可能随着年纪的增长,有些忧虑忧患也应运而生。看着身边的朋友生小孩的生小孩,结婚的结婚的,脱单的脱单,有时候自己也稍微也紧张了起来。这种感觉就像一群小学生的期末考,其它同学纷纷答卷完毕并递交试卷了,而我还没开始答题。也有这么一两个好友他们答题完毕了还不急着起身走出教室,甚至好心偷偷丢纸条给我,那是试题答案,可我可能比较轴,我想自己答题所以谢绝了这样的纸条。

2016年6月份毕业到现在不知不觉业已2年多了,一开始出来心无旁骛,一心只想扎进码农的圈子,然后拿到能拿到一份丰硕的薪资,那时候每天都精力澎湃的学习,眨巴眨巴时间过去了,当初的目标渐渐靠近的同时也产生了新的目标,却也发现很多目标即使达到了也不能让自己快乐多少,比如你费尽心机攻破一个系统编程问题或者加班加点解决了客户的现场问题,心里如释重负的同时,退下来却发现身边没有一个可以跟你分享喜悦的人;再者你拿到你规划的薪资,发现这份薪资依旧是“刚刚可以过”,努力奋斗的回报无非使能过稍微正常点的生活

这几天的深圳特别冷啊,最低都达到了9℃,听北方的同事说他们家乡都下雪了,对我这个从未走出广东,甚至深圳隔壁的香港都没涉足过的人来说,走进一场大雪是一种什么样的奇妙经历?想象不到。2019的愿望:希望能有那么一个人跟我涉足北方城市,一起经历一场大雪

ok,接下来进入正题,来分析一下Linux系统上的system()函数。

程序设计中system()用于执行shell命令,如我们要时间和日期写入某个文件:

system("sh data > file");

system()的函数原型如下:

#include <stdlib.h>
int system(const char *command);

system()的实现:fork()创建一个子进程,并将传入的参数调用execl()函数:

execl("/bin/sh", "sh", "-c", command, (char* )NULL);

为获取system()所创建的子进程状态,还需要调用waitpid(),所以system()的初步实现:

#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
#include "system_test.h"
#include <errno.h>int system_test(char* command)
{pid_t cpid = -1;int status;switch (cpid = fork()) {case -1:perror("fork");return -1;case 0:execl("/bin/sh", "sh", "-c", command, (char* )NULL);_exit(127);default:while (waitpid(cpid, &status, 0) == -1) {if (errno == EINTR) {     /* 被信号中断时继续回去等待,重要 */continue;}perror("waitpid");return -1;}return status;}
}int main(void)
{system_test("date");return 0;
}

运行:

需要注意:
(1) -c选项的作用:告诉shell程序读取下一个命令行参数作为命令输入,而不是从标准输入或者从一个给定的文件中读取命令;
(2)代码调用的是_exit()而非exit(),目的在于防止任一标准I/O缓冲在子进程中被冲洗。
上面代码看似简单,实际上system()的实现还需要考虑到信号。在APUE一书中说到:

POSIX.1要求system()忽略SIGINT和SIGQUIT,阻塞SIGCHLD信号。

这里说到“忽略”和“阻塞”,什么意思:
阻塞:内核会为每个进程维护一组信号,也称之为掩码。在该组的信号将阻塞对所在进程的传递。假设进程A将信号xx放到信号掩码中,当外界(可能是内核,也可能是其他进程)向进程A发xx信号,那么该信号将被延后,直至从进程A的掩码中移除xx信号。使用sigprocmask()系统调用可以显式向信号掩码中添加或移除信号。
忽略:某进程忽略了某信号,若该信号专为该进程而生,那么内核会自行将其丢弃,内核甚至从未知道曾经产生了该信号。使用signal()或者sigaction()系统调用设置信号的对应操作为SIG_IGN即忽略了该信号。

为什么要忽略SIGINT和SIGQUIT,阻塞SIGCHLD信号,且看下文…

最后让我们静待2019的来临吧,希望2019年大家快乐:

system("echo 'Happy2019' >> 2019.year");

写在2019年来临前的倒数0.5小时相关推荐

  1. 写在2019年后的蚂蚁、头条、拼多多的面试总结

    写在2019年后的蚂蚁.头条.拼多多的面试总结 原文:https://github.com/rhwayfun/interview 不想听我BB直接进入面试分享: 准备过程 蚂蚁金服面试分享 拼多多面试 ...

  2. 热点和秒杀来临前要做的5件事

    记得当年<甄嬛传>热播,调用了我们团队的媒体资讯接口.接口被调用挂了.当时虽然我不负责那一块,只是目睹了当时大家在临场解决问题的紧张一幕.但是这件事在我心里埋下了种子,从此追求高可用.高稳 ...

  3. 【系统分析师之路】我的软考修行路(写在2019年最后一周)

    [系统分析师之路] 我的软考修行路(写在2019年最后一周) [摘要] 本文首先交代了博主参加软考的背景,然后结合自己高项的实际经验,总结了自己在高项中良好的方法论和实践上的不足,针对接下来的软考高级 ...

  4. 雷军归来:在变化来临前创造变化

    人们猜测在他回归的时刻,是否会发表一场激情的演说,但更可能是他会将这次回归处理得极其低调,以平息外界对这部上演了18年的角色众多.情节复杂的连续剧的种种猜测. 在任何场合,他说话总是恰到好处,既保持谦 ...

  5. 稳定,实际是暴风雨来临前的死寂

    所谓的稳定项目,接触不到大流量,云技术和分布式架构,实际已经被潮流抛在了后面. 怎么能把前途寄托在稳定二字上? 稳定,实际是暴风雨来临前的死寂. 暴风雨迟早回来,对抗暴风雨的最好武器是自身能力的强大, ...

  6. [译] Python 的打包现状(写于 2019 年)

    Python 的打包现状(写于 2019 年) 在这篇文章中,我将会试着给你讲清楚 python 打包那些错综复杂的细节.我在过去的两个月中,使用每天晚上精力最好的黄金时段尽可能多的收集相关信息.如今 ...

  7. 【许愿贴】写在考研查分前和后

    写在考研查分前与后 查分前 查分后 简单总结 政治 英语 数学 专业课 复试 许愿贴 查分前 给自己点信心吧:68+72+110+120=370 查分后 猜的真准! 简单总结 政治 政治不太理想,选择 ...

  8. 算法入门竞赛习题3-3:数数字(Digit Counting) 把前n(n≤10000)个整数顺次写在一起:123456789101112…数一数0~9各出现多少次。

    算法入门竞赛习题 习题3-3:数数字(Digit Counting) 把前n(n≤10000)个整数顺次写在一起:123456789101112-数一数0-9各出现多少次 (输出10个整数,分别是0, ...

  9. (6)元宇宙来临前Axie Infinity可以做什么呢

    NFT游戏Axie Infinity爆火之后,模仿它的NFT游戏如雨后春笋般一个接一个的出现,如"头号玩家"所呈现的元宇宙被反复提及,刺激着一批又一批新人冲到这场NFT内容爆火带来 ...

  10. 2019年香港计算机考研,【图片】2019年香港前8所大学研究生申请最新情况!【考研吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 2019年香港前8所大学硕士研究生申请最新情况! 1.香港的硕士分为两种:其一授课式研究生(学制一年) 其二研究式研究生(学制二年) 2.香港大学相关硕士 ...

最新文章

  1. Codeforces Round #275 (Div. 2) c
  2. python中else什么意思_python中的else语句
  3. 寄存器、cache、内存、硬盘之间的千丝万缕
  4. android studio gradle 自动更新,android studio gradle 两种更新方法更新
  5. Spring Boot2 整合 Ehcache
  6. delphi if多个条件_判断(if)语句
  7. python抽取指定url页面的title_Python使用scrapy爬虫,爬取今日头条首页推荐新闻
  8. 测试人员转型是大势所趋:我的十年自动化测试经验分享
  9. 根据指定字段排序编号(SQL Server 2005,Update,Order By)
  10. 重新leetcode第1天——二叉树遍历算法讲解合集
  11. Codeforces348B Apple Tree DFS
  12. Oracle 12c RAC--安装grid
  13. JVM 内存分析工具MAT
  14. A315-56 Compal LA-H801P LA-J801P宏基笔记本点位图
  15. django crontab UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfe in position 9: invalid start
  16. 【IoT】产品设计:结构设计之堆叠设计流程(二)
  17. 【业务安全06】接口参数账号修改漏洞——基于metinfov4.0平台
  18. 攻防世界pwn新手区整理
  19. GMM / MoG 聚类 Matlab 可视化 实现
  20. 无刷直流电机的simulink仿真

热门文章

  1. ubuntu: 由unity转gnome3安装出错及解决
  2. panabit之PPPoE认证
  3. dpdk pci驱动探测
  4. 【持续更新】Pun多人在线游戏开发教程
  5. 安装CHD走过的一些坑
  6. 鼠友题库每日百题(四)
  7. OpenBSD安装(转)
  8. 用C++写洛谷P1427小鱼的数字游戏
  9. 喜报丨内蒙古谱尼医学获批开展临床基因扩增检验技术
  10. android 开源fc模拟器_准备开发一款开源NES模拟器