孤儿进程、僵尸进程 僵尸进程:一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。 僵尸进程将会导致资源浪费,而孤儿则不会。
高质量编程 1.类型转换:由于派生类和基类之间的关系,C++保证了派生类对象必须保证其基类子对象的完整性.2.强制转换: 例子:double d3=1.25e+20; double d4=10.35; int i2=(int)d3; int i3=(int)d4; 上述代码的问题,i2会溢出,doubl
线程和进程的关系 在多进程情况下,每个进程都有自己独立的地址空间,而在多线程情况下,同一个进程内的线程共享进程的地址空间。线程的优点是:节约资源、节约时间。子进程是通过拷贝父进程的地址空间来实现的,而线程与进程内的线程共享程序代码。
进程控制 1.获取进程标识 #include #include pid_t getpid(void) 返回调用进程的进程ID pid_t getppid(void) 返回进程的父进程ID uid_t getuid(void) 返回进程的实际用户ID uid_t geteuid(void) 返回进程的有效用户ID gid_t getgid(void) 返回进程的实际组
堆栈的区别 堆栈是系统使用是临时存储区域。它是后进先出的数据结构。C++主要将堆栈用于函数调用。当函数调用时,各种数据被推入堆栈顶部;函数终止后的返回地址、传递给函数的参数、函数返回的结果以及函数中声明的局部变量等等。因此当函数A调用函数B调用函数C,堆栈是增长了,但调用完成后,堆栈又缩小了。堆是一种长期的存储区域。程序用C++的new操作符分配堆。对new的调用 分配所需的内存并返回指向内存的指针。与堆栈不
LINUX 下异常信号收藏 我们介绍一些标准信号的名称以及它们代表的事件。每一个信号名称是一个代表正整数的宏,但是你不要试图去推测宏代表的具体数值,而是直接使用名称。这是因为这个数值会随不同的系统或同样系统的不同版本而不同,但是名称还算是标准化和统一的。 这些名称定义在signal.h中。 int NSIG是一个定义的宏,它描述了定义的信号的数量。由于信号的数值是从0开始连续分配的,所以,NSIG比系统中所定义的最大
僵尸进程 在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程i
C++中的4种类型转换方式 C++中的4种类型转换方式static_cast 静态的_cast dynamic_cast 动态的_cast reinterpret_cast 重新解释的 _cast const_cast 常量的_cast C++ 里最好杜绝使用 C 方式的强制转换, 换用以上 4 个. 我们通常用的是 static_cast 在一类东西都可以转, 但是不是一类的就不能转. 即, 语义上说不通的, 两个完全不同
malloc/free和new/delete 有了malloc/free 为什么还要new/delete ?malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象在消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符