信号的概念及基本操作

在linux/unix系统中,我们如果想杀死一个进程,可以使用 kill -9 PID 的方式来杀死一个进程,这种方式并不是调用了什么系统的API函数实现的,实际是给进程发送了一个 SIGKILL 信号。当进程收到这个信号后执行了一个默认的操作 Term,而这个 Term 代表的就是终止进程 (Term...

wait() 回收子进程

在前面的文章中我们讨论了如何通过 fork() 函数创建子进程,创建后的子进程如果优先于父进程退出,子进程的虚拟内存空间就消失了,但是进程控制块PCB并没有消失,这里面包含了这个子进程的退出状态,需要由父进程来进行回收。在父进程回收之前,这个进程被称为僵尸进程(僵死进程),任何一个子进程都会经过这段僵尸进程的阶段...

gdb 调试基础

程序运行过程中,会产生各种各样的错误和异常信息,这些信息我们可以通过打印日志、输出文字等方式来判断和检测问题,但有的时候程序是在运行态出现故障,使用打印日志等手段没办法精准的定位问题。如果使用gdb来调试,这种问题就可以迎刃而解了。gdb 可以完全操控程序运行,让程序走就走,让程序暂停就暂停,还可以随时查看程序运...

使用 frok() 函数一次创建多个子进程

前面的文章我们讨论了系统函数 fork() 的应用,他可以在一个进程中再创建另外一个子进程,本文测试使用一个 for 循环创建多个子进程,中间一些注意事项已经全部用注释标注清楚。 【实现代码】123456789101112131415161718192021222324252627282930#include ...

fork() 函数详解

fork() 函数是 linux/unix 下一种特别的创建子进程的函数,它不同与 Windows,这个函数在执行成功后会有两个返回值,一个返回值==0代表创建了子进程,一个返回值大于0代表还是当前程序进程,而这个大于0的值就是创建的子进程的进程PID。这个函数比较抽象,我们来看一下...

系统函数 查看/修改/删除 环境变量

通过系统提供的函数,我们一样可以查看、修改和删除环境变量的内容,使用使用函数分别时 getenv()、setenv()、unsetenv(),它们的用法如下: 12345678910111213141516#include <stdio.h>#include <stdlib.h>int ...

遍历环境变量内容

所有应用程序则运行后都会有一组环境变量值,它是一组指针数组,每一个指针指向的内容都具有 name=value 的结构,其中 name 是环境变量名,value 是环境变量值。在程序中我们可以遍历这组环境变量内容,具体代码如下: 123456789101112131415#include <std...

文件描述符详解

在 32 位的 linux/unix 系统下,每个程序打开一个文件都会有一段 4G 的虚拟地址空间,这部分空间中,有1G是内核地址空间,3G是用户地址空间,这个概念我们在之前的文章中有介绍过,可参考 “不同位置的变量在内存中的排布”,其中在内核地址空间中,维护着一个 PCB 进程控制块,其中包含很多进程...

O_EXCL 实现根据文件是否存在来创建文件

在使用 open 函数时,会有这样的需求,如果文件存在,那么就报错退出,如果文件不存在那么就创建该文件。当然我们在执行 open 函数之前可以判断一下文件是否存在,但是这样做不仅多了一步,而且比较麻烦,其实使用 open 中的 O_EXCL 参数就可以解决这种问题。 1int nRet = open("...

Qt 区分多个信号函数绑定一个槽函数

当有多个信号函数(Signal)绑定同一个槽函数(Slot)时,你会有这样的需求,在槽函数中我希望知道到底是哪个信号函数发送出来的信号,这样根据不同的发送者来执行不同的操作。想实现这个功能可以在槽函数中调用 sender() 方法获取发送信号的对象类型。然后进行处理,具体代码如下: 【代码实现】Notice:代...