Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148480
  • 博文数量: 44
  • 博客积分: 2085
  • 博客等级: 大尉
  • 技术积分: 455
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-31 11:03
文章分类

全部博文(44)

文章存档

2013年(3)

2011年(8)

2010年(11)

2009年(22)

我的朋友

分类: C/C++

2009-10-22 13:20:20

1> fork();
pid_t pid;
switch (pid = fork())
{
    case -1:
        /* 这里pid为-1,fork函数失败 */
        /* 一些可能的原因是 */
        /* 进程数或虚拟内存用尽 */
        perror("The fork failed!");
        break;
    case 0:
        /* pid为0,子进程 */
        /* 这里,我们是孩子,要做什么? */
        /* ... */
        /* 但是做完后, 我们需要做类似下面: */
        _exit(0);
    default:
        /* pid大于0,为父进程得到的子进程号 */
        printf("Child's pid is %d ",pid);
}
当然,有人可以用‘if() ... else ...’语句取代‘switch()’语句,但是上面的形式是一个有用的惯用方法。

为何在一个fork的子进程分支中使用_exit函数而不使用exit函数?
-----------------------------------------------------------------
‘exit()’与‘_exit()’有不少区别在使用‘fork()’,特别是‘vfork()’时变得很突出。
‘exit()’与‘_exit()’的基本区别在于前一个调用实施与调用库里用户状态结构(user-mode constructs)有关的清除工作(clean-up),而且调用用户自定义的清除程序(译者注:自定义清除程序由atexit函数定义,可定义多次,并以倒序执行),相对应,后一个函数只为进程实施内核清除工作。
在由‘fork()’创建的子进程分支里,正常情况下使用‘exit()’是不正确的,这是因为使用它会导致标准输入输出(译者注:stdio: Standard Input Output)的缓冲区被清空两次,而且临时文件被出乎意料的删除(译者注:临时文件由tmpfile函数创建在系统临时目录下,文件名由系统随机生成)。
在C++程序中情况会更糟,因为静态目标(static objects)的析构函数(destructors)可以被错误地执行。
(还有一些特殊情况,比如守护程序,它们的*父进程*需要调用‘_exit()’而不是子进程;适用于绝大多数情况的基本规则是,‘exit()’在每一次进入‘main’函数后只调用一次。)在由‘vfork()’创建的子进程分支里,‘exit()’的使用将更加危险,因为它将影响*父*进程的状态。
 
2> 为什么进程的大小不缩减?
当你使用‘free()’函数释放内存给堆时,几乎所有的系统都*不*减少你程序的对内存的使用。
被‘free()’释放的内存仍然属于进程地址空间的一部份,并将被将来的‘malloc()’请求所重复使用。
如果你真的需要释放内存给系统,参看使用‘mmap()’分配私有匿名内存映射(private anonymous mappings)。
当这些内存映射被取消映射时,内存真的将其释放给系统。某些‘malloc()’的实现方法(比如在GNU C库中)在允许时自动使用‘mmap()’实施大容量分配;
这些内存块(blocks)随着‘free()’被释放回系统。当然,如果你的程序的大小增加而你认为它不应该这样,你可能有一个‘内存泄露’(‘memory leak’)- 即在你的的程序中有缺陷(bug)导致未用的内存没释放。
 
3>给读消息队列加个时间(timeout)
...
...//set a timer
while(msgrcv(msgId, msgPtr, msgLen, msgType, 0) == -1)
{
     if(errno == EINTR)
     {
          ....  //timeout
     }
     ....
}
...
 
阅读(736) | 评论(0) | 转发(0) |
0

上一篇:SDRAM 16M to 32M

下一篇:__attribute__

给主人留下些什么吧!~~