Onway

我是一只菜菜菜菜鸟...
posts - 61, comments - 56, trackbacks - 0, articles - 34

2011-12-17 第十三章 守护进程
第一节 引言
1,守护进程通常没有控制终端。

第二节 守护进程的特征
1,所有用户层守护进程都是进程组的组长进程以及会话的首进程,而且是这些进程组和会话中的唯一进程。
2,大多数守护进程的父进程是init进程。

第三节 编程规则
1,六个进程规则使一个普通进程被正确初始化成一个守护进程。

第四节 出错记录
1,对于守护进程,需要一个集中的守护进程出错记录设施。
2,该设施的接口是syslog函数。

第五节 单实例守护进程
1,为了正常运作,某些守护进程实现为单实例的,也就是在任一时刻只运行该守护进程的一个副本。
2,文件锁和记录锁机制是一种方法的基础,该方法用来保证一个守护进程只有一个副本在运行。

第六节 守护进程惯例
1,如果守护进程使用锁文件,那么该文件通常存放在/var/run目录中。
2,若守护进程支持配置选项,那么配置文件通常存放在/etc目录中。
3,守护进程可用命令行启动,但通常它们是由系统初始化脚本之一启动的。如果在守护进程终止时,应当自动重新启动它,则可在/etc/inittab中为该守护进程包括_respawn记录项。
4,为了避免守护进程可能需要停止来重新读取配置文件,可使守护进程捕捉SIGHUP信号。

第七节 客户进程-服务进程模型
1,守护进程常常用作服务器进程。

第八节 小结

posted @ 2011-12-18 12:28 Onway 阅读(213) | 评论 (0)编辑 收藏

     摘要: 第七节 取消选项
1,线程的可取消状态和可取消类型这两个属性影响着线程在响应pthread_cancel函数调用时锁呈现的行为。
2,可取消类型分为异步取消和延迟取消,使用异步取消时,线程可以在任意时刻取消,而不是非得遇到取消点才能被取消。
3,当线程处于延迟取消类型的情况下,可以调用pthread_setcancelstate修改它的可取消状态。
4,取消点是线程检查是否被取消并按照取消请求进行动作的一个位置。
5,当可取消状态设置为PTHREAD_CANCEL_DISABLE时,对pthread_cancel的调用不会杀死进程,相反,取消请求对这个线程来说处于未决状态。
6,可以调用pthread_testcancel函数在程序中自己添加取消点。
  阅读全文

posted @ 2011-12-16 12:41 Onway 阅读(448) | 评论 (0)编辑 收藏

     摘要: 第十二 内容转载引用自:
字符集: http://baike.baidu.com/view/51987.htm
字符编码:http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html
ASCII: http://baike.baidu.com/view/15482.htm
EASCII:http://zh.wikipedia.org/wiki/EASCII
http://zh.wikipedia.org/wiki/ISO/IEC_8859
GBxxxx系列,BIG5:
http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html
UCS&UNICODE:http://zh.wikipedia.org/wiki/通用字符集
http://zh.wikipedia.org/wiki/Unicode
UTF-x系列:http://zh.wikipedia.org/wiki/UTF-8  阅读全文

posted @ 2011-12-04 14:39 Onway 阅读(1579) | 评论 (1)编辑 收藏

     摘要: 做这些笔记的时候是一年前多了。当时还在做着ACM,学这些似乎只是抱着充实自己的心态,当时最想的似乎就是看完整本书,但最终还是在面向对象的部分停下来了。现在很多东西都忘了,毕竟这样学而没有实际使用,肯定很容易忘的。可能当时也是出现了这么个想法而停下来的吧,至少应该是其中一个原因。这份笔记似乎在硬盘里丢失过一次,最后在金山快盘里找回来的。2011-12-4  阅读全文

posted @ 2011-12-04 14:12 Onway 阅读(683) | 评论 (0)编辑 收藏

     摘要: 第三节
1,signal在linux的声明
typedef void (*__sighandler_t) (int);
extern __sighandler_t signal (int __sig, __sighandler_t __handler)
__THROW;
2,SIG_ERR,SIG_DFL和SIG_IGN的定义
#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */

怀疑书上有错:
”如果查看系统的头文件,则很可能会找到下列形式的声明:
#define SIG_ERR (void (*)())-1
#define SIG_DFL (vo  阅读全文

posted @ 2011-12-04 13:48 Onway 阅读(382) | 评论 (0)编辑 收藏

一,使用数据空间:
环境:
宿主机:ubuntu
步骤:
1,进入虚拟机系统(将虚拟机开机),选择:设备->安装增强功能
(最好先在网上下载一个VBoxGuestAdditions.iso的增强功能文件,放到宿主机的/usr/share/virtualbox目录下)
2,安装完后就将虚拟机关机了,选择:控制->设置->数据空间,弹出的界面右侧有一个带加号的文件夹图标,鼠标移动过去有提示,添加数据空间。
3,弹出的“添加数据空间”界面里,数据空间位置选择一个在宿主机上的文件夹,数据空间名称随便,例如sharedata。选上底下的auto-mount,是否只读,你喜欢。
4,确定后开机就行了。
数据空间在虚拟机的位置是/media/sf_数据空间名称,如果是XP的虚拟机,则可以看到一个额外的盘符。
5,注意在虚拟机(linux)中虚拟空间文件夹是所有者是root,所属组是vboxsf,这意味着一般用户是不能访问的,将你的账户添加到其所属组吧。
具体参见用户手册,Guest Additions->Shared folders章节。


二,修正虚拟机的屏幕大小:
XP直接调整分辨率
ubuntu还没试成功


三,导入导出虚拟电脑:
按照向导操作即可。问题是:虚拟电脑上的驱动会不会因为两台宿主机硬件的不同而出问题。应该不会吧,硬件都是虚拟出来的。
因为导入的XP进不了系统,总是自动重启,导入的ubuntu屏幕大小太大(原虚拟机是在19寸的台式电脑,导入到14寸的笔记本),以为驱动出了问题。
后来重装XP才发现,装完后蓝屏(原来导入的XP可能也是这个问题而进不了系统),按照网上教程搞好后,还是要自行调整分辨率。
所以觉得导入导出虚拟电脑,应该不用担心驱动问题。



四,宿主机和虚拟机通信并且虚拟机能够上网
宿主机:ubuntu 11.10 使用adsl拨号上网
虚拟机:centos 6.0

1,宿主机使用ifconfig可以查看到有三个网络接口:eth0,lo,ppp0,其中eth0是没有地址的。
2,宿主机编辑/etc/network/interfaces,修改
auto eth0
iface eth0 inet static
address 192.168.1.1
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
然后重启网络:
sudo /etc/init.d/networking restart
3,virtualbox在虚拟机中虚拟两个网卡,一个使用NAT,一个使用Bridged Adapter
4,虚拟机中编辑/etc/sysconfig/eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROT=dhcp
NAME=net    //不知道这个是做什么的
HWADDR=        //必须的,对照virtualbox中使用NAT方式的网卡MAC地址
5,虚拟机中编辑/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
BOOTPROT=static
IPADDR=192.168.1.2
NETMASK=255.255.255.0
NAME=bridge
TYPE=Ethernet
HWADDR=        //必须的,对照virtualbox中使用bridged adapter的网卡mac地址
6,添加网络管理服务:
chkconfig NetworkManager on    
chkconfig network on
service network restart        //重启网络

posted @ 2011-11-22 15:58 Onway 阅读(472) | 评论 (0)编辑 收藏

/*
 * http.c by Onway 2011-11-14
 * 1,间隔1秒的两次connect避免瞬间造成的错误
 * 2,网络读写超时限制参考自《UNIX环境高级编程》第二版中文版程序清单10-8,
 * 由于程序是单线程,避免进程堵塞。
 * 3,返回值说明
 *     0 正确返回
 *     1 网络连接失败
 *     2 网络IO超时
 *     3 时钟注册失败
 
*/
#include 
"global.h"
#include 
<sys/types.h>
#include 
<sys/socket.h>
#include 
<netinet/in.h>
#include 
<arpa/inet.h>
#include 
<unistd.h>
#include 
<stdlib.h>
#include 
<setjmp.h>

#define PORT 80 
#define BUFFSIZE 10086

static void sig_alrm(int);
static jmp_buf env_alrm;

int QueryWord(const GString *word,const GString *ip,
        GString 
*gstrHtml)
{
    g_string_erase(gstrHtml,
0,-1);

    
/*    http 请求    */
    GString 
*request = g_string_new("GET /search?q=");
    g_string_append(request,word
->str);
    g_string_append(request,
"\
&ue=utf8&keyfrom=dict.index HTTP/1.1\r\n\
Host: dict.youdao.com\r\n\
Connection: close\r\n\
\r\n
");

    
/*    网络地址    */
    
struct sockaddr_in address;
    address.sin_family 
= AF_INET;
    address.sin_addr.s_addr 
= inet_addr(ip->str);
    address.sin_port 
= htons(PORT);

    
/*    网络连接    */
    
int socketfd = socket(AF_INET,SOCK_STREAM,0);
    
if(connect(socketfd,(struct sockaddr *)&address,sizeof(address)) != 0)
    {
        sleep(
1);
        
if(connect(socketfd,(struct sockaddr *)&address,sizeof(address)) != 0)
        {

            g_string_free(request,TRUE);
            
return 1;
        }
    }
    
    
/*    信号注册    */
    
if(signal(SIGALRM,sig_alrm) == SIG_ERR)
    {
        g_string_free(request,TRUE);
        close(socketfd);
        
return 3;
    }
    
if(setjmp(env_alrm) != 0)
    {
        g_string_free(request,TRUE);
        close(socketfd);
        
return 2;
    }
    
    
/*    网络IO    */
    alarm(
3);
    write(socketfd,request
->str,request->len);

    
char buf[BUFFSIZE];
    
int n;
    
while( (n = read(socketfd,buf,BUFFSIZE)) > 0 )
        g_string_append_len(gstrHtml,buf,n);
    alarm(
0);

    
/*    正常返回    */
    g_string_free(request,TRUE);
    close(socketfd);
    
return 0;
}
static void sig_alrm(int signo)
{
    longjmp(env_alrm,
1);
}

posted @ 2011-11-22 11:55 Onway 阅读(613) | 评论 (0)编辑 收藏

     摘要: 1,带有滚动条的多行文本框
只要gtk_scrolled_window_new生成一个滚动窗口,在其上加上textview控件即可gtk_container_add,特点是当textview足够显示的时候,滚动条不可见,否则自动产生(垂直和横向),而且也随着输入一起下滚显示。这个暂不知道怎么设置。
GtkWidget *scroll = gtk_scrolled_window_new(NULL,NULL);
GtkWidget *textview = gtk_text_view_new();
gtk_container_add(GTK_CONTAINER(scroll),textview);

textview总是要与一个textbuffer关联:
GtkTextBuffer *buffer = gtk_text_buffer_new(NULL);
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));


2,控件焦点设置
g  阅读全文

posted @ 2011-11-22 11:47 Onway 阅读(1411) | 评论 (0)编辑 收藏

     摘要: 由于UBUNTU装了唯一的主分区,且无论如何也不能覆盖掉,里面保存了我一个多月的心血,只能在40G的数据备份分区里分出20G的逻辑分区给WIN7,当然最担心的是WIN7会改写引导记录,自己也毫无经验。百度了一会,发现都是说先装的WIN7,决定还是先把WIN7搞上去吧。

放入WIN7的系统盘,在选择安装分区的时候,给个20G的逻辑分区给WIN7,丫的死活不要,说是启动程序无法创建新的分区,也无法定位现有系统分区。

又百度去,有说WIN7能装在逻辑分区,也有说不能的,还有说这个情况是设置了光驱第一启动,哥还真傻冒的让硬盘第一启动,然后光驱放入系统盘,这下直奔UBUNTU去了。  阅读全文

posted @ 2011-11-22 11:17 Onway 阅读(3095) | 评论 (3)编辑 收藏

     摘要: xp下用ISO文件安装ubuntu(该方法网上已有,但与自己实践的稍有差别,特此纪念)
注意:网上的方法似乎是从9.04开始,我用的版本直接就是10.04.1 desktop i386。
二:
将单系统的ubuntu装回windows
我这不是闲着没事做,而是确实需要。
四:
情人节网络诡异  阅读全文

posted @ 2011-11-22 11:10 Onway 阅读(305) | 评论 (0)编辑 收藏

仅列出标题
共6页: 1 2 3 4 5 6