摘要:众所周知,子进程退出后(不管是正常还是异常退出),其父进程需要通过wait或waitpid来回收子进程的一些资源。回收是没有疑义的,但是父进程在哪儿回收,以什么方式回收,却影响着设计思路和效率。 一般的回收机制都属于阻塞回收,父进程阻塞等待子进程技术,收到子进程的退出状态。然而在实验中我需要实现的属于client-server模型。父进程 属于守护进程一类,开启TCP套接字等待链接,每当有请求到来,便fork一个子进程传输信息并自由退出。父进程并不关注子进程的退出状态,是否正常都不 影响今后的服务,但子进程变成僵尸进程便麻烦了,随着时间的进行,僵尸进程一大堆,虽然占用资源不多,但终究是个隐患.
阅读全文
摘要:关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害。 经常在网络上看到有的XDJM问“多进程好还是多线程好?”、“Linux下用多进程还是多线程?”等等期望一劳永逸的问题,我只能说:没有最好,只有更好。根据实际情况来判断,哪个更加合适就是哪个好。 我们按照多个不同的维度,来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个好得不得了,另外一个差的无法忍受)。 看起来比较简单,优势对比上是“线程 2.5 v 3.5 进
阅读全文
摘要:什么是coredump?通常情况下coredmp包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息等。可以理解为把程序工作的当前状态存储成一个文件。许多程序和操作系统出错时会自动生成一个core文件。如何使用coredump?coredump可以用在很多场合,使用Linux,或者solaris的人可能都有过这种经历,系统在跑一些压力测试或者系统负载一大的话,系统就hang住了或者干脆system panic.这时唯一能帮助你分析和解决问题的就是coredump了。现在很多应该程序出错时也会出现coredump.分析coredump的工具现在大部分类unix操作系统都提供了分析core文
阅读全文
摘要:C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理(创建数据库、创建表格、插入数据、查询、数据、删除数据等)。首先要编译好sqlite的库文件 : libsqlite3.a libsqlite3.la libsqlite3.so libsqlite3.so.0 libsqlite3.so.0.8.6 pkgconfig可执行文件 : sqlite3本次测试: sqlite3的库文件目录是:/usr/local/lib 可执行文件 sqlite3 的目录是: /usr/local/bin 头文件 sqlite3.h 的目录是: /usr/local/include用ls命令查看如
阅读全文
摘要:接触linux一段时间了,有个权限问题让我一直郁闷。网上也没找到(估计是关键字不对),就是这个0777,最前面的0是什么意思。最近看到一本书(Linux与unix shell编程指南),终于找到答案了。 先说一下777什么意思吧,linux下文件权限分为所属用户权限、所属组权限和其他权限。 每一个又分为r(读)w(写)x(可执行)。如果你在linux中运行 ls -l就会显示权限如: Java代码 -rwxr-xr-x 1 root root 12 09-02 15:21 my_test.sh “-”表示文件类型不用管。第一个rwx是所属用户的权限,表示所属用户(root)对本文件可读(r)可
阅读全文
摘要:在UNIX系统中,作业控制允许在一个终端上启动多个作业(进程组),控制哪一个作业可以存取该终端,以及哪些作业在后台运行。为了支持作业控制,引入了进程组,会话期,控制终端等概念,还需要内核以一定的信号支持。一·进程组。 每一个进程除了有一个进程PID之外,还属于一个进程组,用进程组ID表示。返回当前进程组ID的系统调用为:pid_t getpgrp();每个进程组都有一个组长进程,组长进程的标识是进程组ID等于其进程ID。 进程可以调用setpgid系统调用参加一个现存的组或者创建一个新的进程组。int setpgid(pid_t pid, pid_t pgid);这将pid进程的进程
阅读全文
摘要:摘要:针对Linux环境下的守护进程daemon,分析了一般性守护进程的编写方法,并提出若干见解,通过总结归纳进而为设计和开发守护进程提供了有意的参考,给出了基于Linux守护进程实现的主要思想。关键词: 守护进程;信号量;控制终端 1 引言 Linux在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程(Daemons)来执行的。 编写守护进程实际上是把一个普通进程按照守护进程的特性进行改造。比如,网络通信服务中的守护进程需要能同时接受多个请求,它不断地在侦听端等待远程的 连接请求,收...
阅读全文
摘要:【需求】不影响服务器处理的前提下,检测客户端程序是否被强制终了。【现状】服务器端和客户端的Socket都设定了keepalive属性。服务器端设定了探测次数等参数,客户端、服务器只是打开了keepalive机能服务器端起了一个监视线程,利用select来检测socket是否被关闭。。。下面这是我的一点肤浅理解。1.关于keep alive无论windows,还是linux,keepalive就三个参数:sk->keepalive_probes:探测次数sk->keepalive_time 探测的超时sk->keepalive_intvl 探测间隔对 于一个已经建立的tcp连接
阅读全文
摘要:简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址.一些注意事项1、出现段错误时,首先应该想到段错误的定义,从它出发考虑引发错误的原因。2、在使用指针时,定义了指针后记得初始化指针,在使用的时候记得判断是否为NULL。3、在使用数组时,注意数组是否被初始化,数组下标是否越界,数组元素是否存在等。4、在访问变量时,注意变量所占地址空间是否已经被程序释放掉。5、在处理变量时,注意变量的格式控制是否合理等。一般 来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的
阅读全文
摘要:Lex(Lexical Analyzar 词法分析生成器),Yacc(Yet Another Compiler Compiler编译器代码生成器)是Unix下十分重要的词法分析,语法分析的工具。经常用于语言分析,公式编译等广泛领域。遗憾的是网上中文资料介绍不是过于简单,就是跳跃太大,入门参考意义并不大。本文通过循序渐进的例子,从0开始了解掌握Lex和Yacc的用法。<本系列文章的地址:http://blog.csdn.net/liwei_cmg/category/207528.aspx>一.Lex(Lexical Analyzar) 初步示例先看简单的例子(注:本文所有实例皆在Re
阅读全文
摘要:解压缩权限丢失:自己编写的头文件链接无法正常引用结构体无法正常引用系统头文件解压缩权限丢失:下载的压缩包要在Linux下解压缩,若在Windows下会丢失x权限使用命令 chmod +x 添加权限自己编写的头文件链接:无法引用自己写的头文件 make后显示 error:xxx.h: No such file or directory需要在makefile中指明头文件地址: 例如 gcc -c -I/home/sui/code/ main.c无法正常引用结构体:函数 int router_traversal( struct ipc_socket *socket, struct process *
阅读全文
摘要:背景Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别。不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断。本文中我们从 5 个方面总结出 Linux 多线程编程上的问题,并分别引出相关改善的开发经验,用以避免这些的陷阱。我们希望这些经验可以帮助读者们能更好更快的熟悉 Linux 平台的多线程编程。我们假设读者都已经很熟悉 Linux 平台上基本的线程编程的 Pthread 库 API 。其他的第三方用以线程编程的库,如 boost,将不会在本文中提及。本文中主要涉及的题材包括线程开发中的线程管理,互斥变量,
阅读全文
摘要:最近开始入手网络编程领域,简单的学习了PThread的几个库方法,然后就开始进项目组学习了。遇到的最大问题就是死锁问题,因为我用的方法是: pthread_cond_wait()和 pthread_cond_signal() 来控制的,有的时候看着明明是对的或者说是单步调试的情况下是正确的,但是一运行就卡住不动了,实在是太郁闷了,这个时候我发现了一个有用的函数:pthread_cond_timedwait (pthread_cond_t * _cond,pthread_mutex_t * _mutex,_const struct timespec * _abstime);这个函数的解释为:比函
阅读全文
摘要:学习shell程序设计的方法就是:动手 + man command下面脚本全部是在Cygwin下测试的。$ /bin/bash --versionGNU bash, version 2.05b.0(1)-release (i686-pc-cygwin)Copyright (C) 2002 Free Software Foundation, Inc.编写shell脚本程序有两种方式:【1】可以输入一系列命令让shell交互地执行它们。【2】可以把这些命令保存到一个文件中,然后将该文件作为一个程序来调用。Bash常用命令目录:(1) read命令 —— 变量内容由用户决定(2) 重定向输出和输入(
阅读全文
摘要:(一) gcc的基本用法(二) 警告提示功能选项(三) 库操作选项(四) 调试选项(五) 交叉编译选项(一) gcc的基本用法使用gcc编译器时,必须给出一系列必要的调用参数和文件名称。不同参数的先后顺序对执行结果没有影响,只有在使用同类参数时的先后顺序才需要考虑。如果使用了多个 -L 的参数来定义库目录,gcc会根据多个 -L 参数的先后顺序来执行相应的库目录。因 为很多gcc参数都由多个字母组成,所以gcc参数不支持单字母的组合,Linux中常被叫短参数(short options),如 -dr 与 -d -r 的含义不一样。gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本
阅读全文
摘要:(一) 有漏洞的程序(二) 代码检查(三) 取样法(四) 使用gdb进行调试(一) 有漏洞的程序view plain/*debug1.c*/typedefstruct{char*data;intkey;}item;itemarray[]={{"bill",3},{"neil",4},{"john",2},{"rick",5},{"alex",1},};voidsort(item*a,intn){inti=0,j=0;ints=1;for(;i<n&&s!=0;i++){s=
阅读全文
摘要:(1) makefile的语法(2) make命令的选项和参数1、依赖关系2、规则3、makefile文件中的注释4、makefile文件中的宏5、多个目标6、内置规则make工具解决的问题:它会在必要时重新编译所有受改动影响的源文件。注意:make命令不仅仅用于编译程序,无论何时,当需要通过多个输入文件来生成输出文件时,你都可以利用它来完成任务。它的其他用法还包括文档处理。虽然make命令内置了很多智能机制,但光凭其自身是无法了解应该如何建立应用程序的。你必须为其提供一个文件,告诉它应用程序应该如何构造,这个文件称为makefile。makefile文件一般都会和项目的其他源文件放在同一个目
阅读全文