Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2026833
  • 博文数量: 413
  • 博客积分: 10926
  • 博客等级: 上将
  • 技术积分: 3862
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-09 18:14
文章分类

全部博文(413)

文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(6)

2011年(138)

2010年(85)

2009年(42)

2008年(46)

2007年(26)

2006年(59)

分类: LINUX

2006-03-30 10:45:27

程序调用fork创建一个进程,称为子进程.调用的进程称为父进程.子进程继承了父进程的几乎所有的属性:
(1) 实际UID,GID和有效UID,GID.
(2) 环境变量.
(3) 附加GID.
(4) 调用exec()时的关闭标志.
(5) UID设置模式比特位.
(6) GID设置模式比特位.
(7) 进程组号.
(8) 会话ID.
(9) 控制终端.
(10)当前工作目录.
(11)根目录.
(12)文件创建掩码UMASK.
(13)文件长度限制ULIMIT.
(14)预定值, 如优先级和任何其他的进程预定参数, 根据种类不同决定是否可以继承.
(15)还有一些其它属性.

当然,子进程也具有跟父进程不同的属性:
(1)进程号, 子进程号不同与任何一个活动的进程组号.
(2) 子进程继承父进程的文件描述符或流时, 具有自己的一个拷贝并且与父进程和其它子进程共享该资源.
(3) 子进程的用户时间和系统时间被初始化为0.
(4) 子进程的超时时钟设置为0.
(5) 子进程的信号处理函数指针组置为空.
(6) 子进程不继承父进程的记录锁.

调用fork会返回两次:
==0: 代表子进程;
>0 : 代表父进程
<0 : error

ex.
pid_t pid;
if ((pid=fork())>0)
{
    //父进程处理过程
}
else if (pid==0)
{
    //子进程处理过程
    exit(0);//子进程结束时调用exit退出
}
else
{
    //创建子进程失败处理
}

补充说明:
(1) 在子进程中可以直接写代码或者用execl系列函数执行一个应用程序.如果是用execl函数执行子进程,且调用execl成功,那么子进程会一直阻塞在execl处,执行完后直接退出子进程,而不会再执行execl以后的代码.
(2) 子进程结束时用exit退出.
(3) 子进程创建后,完全复制父进程的数据空间,堆和栈,但父子进程不共享这些属性.也就是说,调用fork之前,全局变量和本可见域内的变量,对于父子进程都 是一样的;但是,调用fork之后,父子进程任何一个改变了全局变量或本可见域内的变量的值,都不影响另外一个,所以这个时候父子进程如果要进行数据交 换,需通过IPC(inter process communication)技术.
(4) 等待子进程结束有多种方法:
(a) 在父进程中用wait或waitpid,但是如果在子进程返回之前,父进程需要处理其他事件,那么我们应该使用下面的方法.而不应该新开一个线程,在线程 中调用wait或waitpid,因为在ARM9下,线程中调用wait或waitpid会立即返回(原因不明).
(b) 使用signal,捕捉SIGCHLD信号.
(c) 使用sigaction捕捉SIGCHLD信号.
注意: signal或sigaction的处理函数属于父进程而不是子进程.
阅读(1317) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~