- 浏览: 1489267 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (525)
- SEO (16)
- JAVA-EE-Hibernate (6)
- JAVA-EE-Struts (29)
- JAVA-EE-Spring (15)
- Linux (37)
- JAVA-SE (29)
- NetWork (1)
- CMS (14)
- Semantic Research (3)
- RIA-Flex (0)
- Ajax-Extjs (4)
- Ajax-Jquery (1)
- www.godaddy.com (0)
- SSH (34)
- JavaScript (6)
- SoftwareEngineer (9)
- CMMI (0)
- IDE-Myeclipse (3)
- PHP (1)
- Algorithm (3)
- C/C++ (18)
- Concept&Items (2)
- Useful WebSite (1)
- ApacheServer (2)
- CodeReading (1)
- Socket (2)
- UML (10)
- PowerDesigner (1)
- Repository (19)
- MySQL (3)
- SqlServer (0)
- Society (1)
- Tomcat (7)
- WebService (5)
- JBoss (1)
- FCKeditor (1)
- PS/DW/CD/FW (0)
- DesignPattern (11)
- WebSite_Security (1)
- WordPress (5)
- WebConstruction (3)
- XML|XSD (7)
- Android (0)
- Project-In-Action (9)
- DatabaseDesign (3)
- taglib (7)
- DIV+CSS (10)
- Silverlight (52)
- JSON (7)
- VC++ (8)
- C# (8)
- LINQ (1)
- WCF&SOA (5)
- .NET (20)
- SOA (1)
- Mashup (2)
- RegEx (6)
- Psychology (5)
- Stock (1)
- Google (2)
- Interview (4)
- HTML5 (1)
- Marketing (4)
- Vaadin (2)
- Agile (2)
- Apache-common (6)
- ANTLR (0)
- REST (1)
- HtmlAnalysis (18)
- csv-export (3)
- Nucth (3)
- Xpath (1)
- Velocity (6)
- ASP.NET (9)
- Product (2)
- CSS (1)
最新评论
-
lt26w:
理解成门面模式应该比较容易明白吧
FacadePattern-Java代码实例讲解 -
lt26w:
看下面的例子比较明白.
FacadePattern-Java代码实例讲解 -
javaloverkehui:
这也叫文档,别逗我行吗,也就自己看看。
HtmlCleaner API -
SE_XiaoFeng:
至少也应该写个注释吧。
HtmlCleaner API -
jfzshandong:
...
org.springframework.web.filter.CharacterEncodingFilter 配置
第一贴:cu上关于fork()函数的精辟分析 声明:在别人的博客上看到这篇文章,真的很精辟,把问题一下子讲清楚了。所以,特意转贴在此,向各位高人致敬,也向原贴主致谢!本人不改变原贴的风貌。 查看原文
作者:ccf 发表于:2006-04-01 17:11:01
#include <unistd.h>; #include <sys/types.h>;
main ()
{
pid_t pid;
pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %dn",getpid());
else
printf("i am the parent process, my process id is %dn",getpid());
}
结果是
[root@localhost c]# ./a.out
i am the child process, my process id is 4286
i am the parent process, my process id is 4285
我就想不到为什么两行都打印出来了,在我想来,不管pid是多少,都应该只有一行才对
chg.s 回复于:2004-04-27 21:09:30
要搞清楚fork的执行过程,就必须先讲清楚操作系统中的“进程(process)”概念。一个进程,主要包含三个元素:
o. 一个可以执行的程序;
o. 和该进程相关联的全部数据(包括变量,内存空间,缓冲区等等);
o. 程序的执行上下文(execution context)。
不妨简单理解为,一个进程表示的,就是一个可执行程序的一次执行过程中的一个状态。操作系统对进程的管理,典型的情况,是通过进程表完成的。进程表中的每一个表项,记录的是当前操作系统中一个进程的情况。对于单 CPU的情况而言,每一特定时刻只有一个进程占用 CPU,但是系统中可能同时存在多个活动的(等待执行或继续执行的)进程。
一个称为“程序计数器(program counter, pc)”的寄存器,指出当前占用 CPU的进程要执行的下一条指令的位置。
当分给某个进程的 CPU时间已经用完,操作系统将该进程相关的寄存器的值,保存到该进程在进程表中对应的表项里面;把将要接替这个进程占用 CPU的那个进程的上下文,从进程表中读出,并更新相应的寄存器(这个过程称为“上下文交换(process context switch)”,实际的上下文交换需要涉及到更多的数据,那和fork无关,不再多说,主要要记住程序寄存器pc指出程序当前已经执行到哪里,是进程上下文的重要内容,换出 CPU的进程要保存这个寄存器的值,换入CPU的进程,也要根据进程表中保存的本进程执行上下文信息,更新这个寄存器)。
好了,有这些概念打底,可以说fork了。当你的程序执行到下面的语句:pid=fork();
操作系统创建一个新的进程(子进程),并且在进程表中相应为它建立一个新的表项。新进程和原有进程的可执行程序是同一个程序;上下文和数据,绝大部分就是原进程(父进程)的拷贝,但它们是两个相互独立的进程!此时程序寄存器pc,在父、子进程的上下文中都声称,这个进程目前执行到fork调用即将返回(此时子进程不占有CPU,子进程的pc不是真正保存在寄存器中,而是作为进程上下文保存在进程表中的对应表项内)。问题是怎么返回,在父子进程中就分道扬镳。
父进程继续执行,操作系统对fork的实现,使这个调用在父进程中返回刚刚创建的子进程的pid(一个正整数),所以下面的if语句中pid<0, pid==0的两个分支都不会执行。所以输出i am the parent process...
子进程在之后的某个时候得到调度,它的上下文被换入,占据 CPU,操作系统对fork的实现,使得子进程中fork调用返回0。所以在这个进程(注意这不是父进程了哦,虽然是同一个程序,但是这是同一个程序的另外一次执行,在操作系统中这次执行是由另外一个进程表示的,从执行的角度说和父进程相互独立)中pid=0。这个进程继续执行的过程中,if语句中 pid<0不满足,但是pid==0是true。所以输出i am the child process...
我想你比较困惑的就是,为什么看上去程序中互斥的两个分支都被执行了。在一个程序的一次执行中,这当然是不可能的;但是你看到的两行输出是来自两个进程,这两个进程来自同一个程序的两次执行。
我的天,不知道说明白了没……
zhaojinbo 回复于:2004-04-28 12:35:50
fork 之后,操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同,如果fork成功,子进程中fork的返回值是0,父进程中 fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。
可以这样想象,2个进程一直同时运行,而且步调一致,在fork之后,他们分别作不同的工作,也就是分岔了。这也是fork为什么叫fork的原因。
至于那一个最先运行,可能与操作系统有关,而且这个问题在实际应用中并不重要,如果需要父子进程协同,可以通过原语的办法解决。
sniper 回复于:2004-04-28 22:11:15
哦,偶明白了,在程序段里用了fork();之后程序出了分岔,派生出了两个进程。具体哪个先运行就看该系统的调度算法了。
在这里,我们可以这么认为,在运行到"pid=fork();"时系统派生出一个跟主程序一模一样的子进程。该进程的"pid=fork();"一句中 pid得到的就是子进程本身的 pid;子进程结束后,父进程的"pid=fork();"中pid得到的就是父进程本身的pid。因此该程序有两行输出。
注:此处不准确,在子进程中pid的值为0,通过getpid可以获取子进程的进程id;在父进程中pid为父进程编号。
勘误:父进程中的pid值为子进程进程号,只有父进程执行的getpid()才是他自己的进程号。寒,彻底的in了 (yanh_lzu:看了这两个错误的说法,相信大家都不会犯错误了。)
jjl3 回复于:2004-07-14 11:43:20
我做如下修改
结果是
[root@localhost c]# ./a.out
fork!i am the child process, my process id is 4286
fork!i am the parent process, my process id is 4285
但我改成printf("fork!n");后,结果是
[root@localhost c]# ./a.out
fork!
i am the child process, my process id is 4286
i am the parent process, my process id is 4285
为什么只有一个fork!打印出来了?上一个为什么有2个?
bashfulboy 回复于:2004-07-14 22:10:52
我也来一下:
wujiajia 的理解有些错误,
printf("AAAAAAAA");//print 一次; 这里会print 2次
如果你将 printf("AAAAAA") 换成 printf("AAAAAAn") 那么就是只打印一次了.
主要的区别是因为有了一个 n 回车符号
这就跟Printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上
但是,只要看到有 n 则会立即刷新stdout,因此就马上能够打印了.
运行了printf("AAAAAA") 后, AAAAAA 仅仅被放到了缓冲里,再运行到fork时,缓冲里面的 AAAAAA 被子进程继承了
因此在子进程度stdout缓冲里面就也有了 AAAAAA.
所以,你最终看到的会是 AAAAAA 被printf了2次!!!!
而运行 printf("AAAAAAn")后, AAAAAA 被立即打印到了屏幕上,之后fork到的子进程里的stdout缓冲里不会有 AAAAAA 内容
因此你看到的结果会是 AAAAAA 被printf了1次!!!!
(精要)
albcamus 回复于:2005-03-08 15:56:11
>;>;派生子进程的pid变量并没有被改变是什么意思 对于子进程来讲pid不就是0吗
1,派生子进程的进程,即父进程,其pid不变;
2,对子进程来说,fork返回给它0,但它的pid绝对不会是0;之所以fork返回0给它,是因为它随时可以调用getpid()来获取自己的pid;
3,楼上的楼上的你的观点是对的,fork之后夫子进程除非采用了同步手段,否则不能确定谁先运行,也不能确定谁先结束。认为子进程结束后父进程才从fork返回的,这是不对的,fork不是这样的,vfork才这样。
看过技术贴,再来看文档,就一下子理解了。 查看下文出处 第二贴:fork函数与vfork函数
一、fork
1. 调用方法
#include <sys/types.h>
#include <unistd.h> pid_t fork(void);
正确返回:在父进程中返回子进程的进程号,在子进程中返回0
错误返回:-1 子进程是父进程的一个拷贝。即,子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存;而对于只读的代码段,通常使用共享内存的方式访问。fork返回后,子进程和父进程都从调用fork函数的下一条语句开始执行。
父进程与子进程的不同之处在于:fork的返回值不同——父进程中的返回值为子进程的进程号,而子进程为0
2. fork函数调用的用途
⑴ 一个进程希望复制自身,从而父子进程能同时执行不同段的代码。
⑵ 进程想执行另外一个程序 二、vfork
1. 调用方法
与fork函数完全相同
#include <sys/types.h>
#include <unistd.h> pid_t fork(void);
正确返回:在父进程中返回子进程的进程号,在子进程中返回0
错误返回:-1 2. vfork函数调用的用途
用vfork创建的进程主要目的是用exec函数执行另外的程序,与fork的第二个用途相同 三、fork与vfork的区别
1. fork要拷贝父进程的数据段;而vfork则不需要完全拷贝父进程的数据段,在子进程没有调用exec和exit之前,子进程与父进程共享数据段
2. fork不对父子进程的执行次序进行任何限制;而在vfork调用中,子进程先运行,父进程挂起,直到子进程调用了exec或exit之后,父子进程的执行次序才不再有限制 四、结束子进程
结束子进程不用exit(0),而使用_exit(0)。这是因为_exit(0)在结束进程时,不对标准I/O流进行任何操作。而exit(0)则会关闭进程的所有标准I/O流。
人家说的理解了,自己来试试看: 下文出处 首先是:jiangdamalong 2006-05-27 17:17:30 在 Linux/Unix社区 / 程序开发区 提问 先看一个程序
结果是返回a,b或者b,a
因为fork调用将执行两次返回分别从子进程和父进程返回
由于父进程和子进程无关,父进程与子进程都可能先返回
在看一个程序
为什么会返回6个字母??????????? 然后是 anguxiang 的回答: 事实上,理解fork()的关键在于它的返回点在哪里。fork最特殊的地方就在于他有两个甚至三个返回值,注意是同时返回两个值。其中pid=0的这个返回值用来执行子进程的代码,而大于0的一个返回值为父进程的代码块。第一次fork调用的时候生叉分为两个进程,不妨设为a父进程和b子进程。他们分别各自在第二次fork调用之前打印了b和a各一次;在第一次叉分的这两个进程中都含有
这段代码。很明显,a父进程和b子进程在这段代码中又各自独立的被叉分为两个进程。这两个进程每个进程又都打印了a,c各一次。到此,在程序中总共打印三次a两次c和一次b。总共6个字母。
注:在第一次叉分为两个进程的时候父子进程含有完全相同的代码(第二次仍然相同),只是因为在父子进程中返回的PID的值不同,父进程代码中的PID的值大于0,子进程代码中的值等于0,从而通过if这样的分支选择语句来执行各自的任务。 结束:向上面提到的高人们致敬!
http://blog.csdn.net/yanh_lzu/archive/2008/04/21/2311644.aspx
作者:ccf 发表于:2006-04-01 17:11:01
#include <unistd.h>; #include <sys/types.h>;
main ()
{
pid_t pid;
pid=fork();
if (pid < 0)
printf("error in fork!");
else if (pid == 0)
printf("i am the child process, my process id is %dn",getpid());
else
printf("i am the parent process, my process id is %dn",getpid());
}
结果是
[root@localhost c]# ./a.out
i am the child process, my process id is 4286
i am the parent process, my process id is 4285
我就想不到为什么两行都打印出来了,在我想来,不管pid是多少,都应该只有一行才对
chg.s 回复于:2004-04-27 21:09:30
要搞清楚fork的执行过程,就必须先讲清楚操作系统中的“进程(process)”概念。一个进程,主要包含三个元素:
o. 一个可以执行的程序;
o. 和该进程相关联的全部数据(包括变量,内存空间,缓冲区等等);
o. 程序的执行上下文(execution context)。
不妨简单理解为,一个进程表示的,就是一个可执行程序的一次执行过程中的一个状态。操作系统对进程的管理,典型的情况,是通过进程表完成的。进程表中的每一个表项,记录的是当前操作系统中一个进程的情况。对于单 CPU的情况而言,每一特定时刻只有一个进程占用 CPU,但是系统中可能同时存在多个活动的(等待执行或继续执行的)进程。
一个称为“程序计数器(program counter, pc)”的寄存器,指出当前占用 CPU的进程要执行的下一条指令的位置。
当分给某个进程的 CPU时间已经用完,操作系统将该进程相关的寄存器的值,保存到该进程在进程表中对应的表项里面;把将要接替这个进程占用 CPU的那个进程的上下文,从进程表中读出,并更新相应的寄存器(这个过程称为“上下文交换(process context switch)”,实际的上下文交换需要涉及到更多的数据,那和fork无关,不再多说,主要要记住程序寄存器pc指出程序当前已经执行到哪里,是进程上下文的重要内容,换出 CPU的进程要保存这个寄存器的值,换入CPU的进程,也要根据进程表中保存的本进程执行上下文信息,更新这个寄存器)。
好了,有这些概念打底,可以说fork了。当你的程序执行到下面的语句:pid=fork();
操作系统创建一个新的进程(子进程),并且在进程表中相应为它建立一个新的表项。新进程和原有进程的可执行程序是同一个程序;上下文和数据,绝大部分就是原进程(父进程)的拷贝,但它们是两个相互独立的进程!此时程序寄存器pc,在父、子进程的上下文中都声称,这个进程目前执行到fork调用即将返回(此时子进程不占有CPU,子进程的pc不是真正保存在寄存器中,而是作为进程上下文保存在进程表中的对应表项内)。问题是怎么返回,在父子进程中就分道扬镳。
父进程继续执行,操作系统对fork的实现,使这个调用在父进程中返回刚刚创建的子进程的pid(一个正整数),所以下面的if语句中pid<0, pid==0的两个分支都不会执行。所以输出i am the parent process...
子进程在之后的某个时候得到调度,它的上下文被换入,占据 CPU,操作系统对fork的实现,使得子进程中fork调用返回0。所以在这个进程(注意这不是父进程了哦,虽然是同一个程序,但是这是同一个程序的另外一次执行,在操作系统中这次执行是由另外一个进程表示的,从执行的角度说和父进程相互独立)中pid=0。这个进程继续执行的过程中,if语句中 pid<0不满足,但是pid==0是true。所以输出i am the child process...
我想你比较困惑的就是,为什么看上去程序中互斥的两个分支都被执行了。在一个程序的一次执行中,这当然是不可能的;但是你看到的两行输出是来自两个进程,这两个进程来自同一个程序的两次执行。
我的天,不知道说明白了没……
zhaojinbo 回复于:2004-04-28 12:35:50
fork 之后,操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同,如果fork成功,子进程中fork的返回值是0,父进程中 fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。
可以这样想象,2个进程一直同时运行,而且步调一致,在fork之后,他们分别作不同的工作,也就是分岔了。这也是fork为什么叫fork的原因。
至于那一个最先运行,可能与操作系统有关,而且这个问题在实际应用中并不重要,如果需要父子进程协同,可以通过原语的办法解决。
sniper 回复于:2004-04-28 22:11:15
哦,偶明白了,在程序段里用了fork();之后程序出了分岔,派生出了两个进程。具体哪个先运行就看该系统的调度算法了。
在这里,我们可以这么认为,在运行到"pid=fork();"时系统派生出一个跟主程序一模一样的子进程。该进程的"pid=fork();"一句中 pid得到的就是子进程本身的 pid;子进程结束后,父进程的"pid=fork();"中pid得到的就是父进程本身的pid。因此该程序有两行输出。
注:此处不准确,在子进程中pid的值为0,通过getpid可以获取子进程的进程id;在父进程中pid为父进程编号。
勘误:父进程中的pid值为子进程进程号,只有父进程执行的getpid()才是他自己的进程号。寒,彻底的in了 (yanh_lzu:看了这两个错误的说法,相信大家都不会犯错误了。)
jjl3 回复于:2004-07-14 11:43:20
我做如下修改
#include <unistd.h>; #include <sys/types.h>; main () { pid_t pid; printf("fork!"); // printf("fork!n"); pid=fork(); if (pid < 0) printf("error in fork!"); else if (pid == 0) printf("i am the child process, my process id is %dn",getpid()); else printf("i am the parent process, my process id is %dn",getpid()); }
结果是
[root@localhost c]# ./a.out
fork!i am the child process, my process id is 4286
fork!i am the parent process, my process id is 4285
但我改成printf("fork!n");后,结果是
[root@localhost c]# ./a.out
fork!
i am the child process, my process id is 4286
i am the parent process, my process id is 4285
为什么只有一个fork!打印出来了?上一个为什么有2个?
bashfulboy 回复于:2004-07-14 22:10:52
我也来一下:
wujiajia 的理解有些错误,
printf("AAAAAAAA");//print 一次; 这里会print 2次
如果你将 printf("AAAAAA") 换成 printf("AAAAAAn") 那么就是只打印一次了.
主要的区别是因为有了一个 n 回车符号
这就跟Printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上
但是,只要看到有 n 则会立即刷新stdout,因此就马上能够打印了.
运行了printf("AAAAAA") 后, AAAAAA 仅仅被放到了缓冲里,再运行到fork时,缓冲里面的 AAAAAA 被子进程继承了
因此在子进程度stdout缓冲里面就也有了 AAAAAA.
所以,你最终看到的会是 AAAAAA 被printf了2次!!!!
而运行 printf("AAAAAAn")后, AAAAAA 被立即打印到了屏幕上,之后fork到的子进程里的stdout缓冲里不会有 AAAAAA 内容
因此你看到的结果会是 AAAAAA 被printf了1次!!!!
(精要)
albcamus 回复于:2005-03-08 15:56:11
>;>;派生子进程的pid变量并没有被改变是什么意思 对于子进程来讲pid不就是0吗
1,派生子进程的进程,即父进程,其pid不变;
2,对子进程来说,fork返回给它0,但它的pid绝对不会是0;之所以fork返回0给它,是因为它随时可以调用getpid()来获取自己的pid;
3,楼上的楼上的你的观点是对的,fork之后夫子进程除非采用了同步手段,否则不能确定谁先运行,也不能确定谁先结束。认为子进程结束后父进程才从fork返回的,这是不对的,fork不是这样的,vfork才这样。
看过技术贴,再来看文档,就一下子理解了。 查看下文出处 第二贴:fork函数与vfork函数
一、fork
1. 调用方法
#include <sys/types.h>
#include <unistd.h> pid_t fork(void);
正确返回:在父进程中返回子进程的进程号,在子进程中返回0
错误返回:-1 子进程是父进程的一个拷贝。即,子进程从父进程得到了数据段和堆栈段的拷贝,这些需要分配新的内存;而对于只读的代码段,通常使用共享内存的方式访问。fork返回后,子进程和父进程都从调用fork函数的下一条语句开始执行。
父进程与子进程的不同之处在于:fork的返回值不同——父进程中的返回值为子进程的进程号,而子进程为0
2. fork函数调用的用途
⑴ 一个进程希望复制自身,从而父子进程能同时执行不同段的代码。
⑵ 进程想执行另外一个程序 二、vfork
1. 调用方法
与fork函数完全相同
#include <sys/types.h>
#include <unistd.h> pid_t fork(void);
正确返回:在父进程中返回子进程的进程号,在子进程中返回0
错误返回:-1 2. vfork函数调用的用途
用vfork创建的进程主要目的是用exec函数执行另外的程序,与fork的第二个用途相同 三、fork与vfork的区别
1. fork要拷贝父进程的数据段;而vfork则不需要完全拷贝父进程的数据段,在子进程没有调用exec和exit之前,子进程与父进程共享数据段
2. fork不对父子进程的执行次序进行任何限制;而在vfork调用中,子进程先运行,父进程挂起,直到子进程调用了exec或exit之后,父子进程的执行次序才不再有限制 四、结束子进程
结束子进程不用exit(0),而使用_exit(0)。这是因为_exit(0)在结束进程时,不对标准I/O流进行任何操作。而exit(0)则会关闭进程的所有标准I/O流。
人家说的理解了,自己来试试看: 下文出处 首先是:jiangdamalong 2006-05-27 17:17:30 在 Linux/Unix社区 / 程序开发区 提问 先看一个程序
main() { pid_t pid; if(pid=fork()<0) { printf("error!"); } else { if(pid==0) printf("a\n"); else printf("b\n"); } }
结果是返回a,b或者b,a
因为fork调用将执行两次返回分别从子进程和父进程返回
由于父进程和子进程无关,父进程与子进程都可能先返回
在看一个程序
main() { pid_t a_pid,b_fork; if(a_pid=fork()<0) { printf("error!"); } else { if(a_pid==0) printf("b\n"); else printf("a\n"); } if(b_pid=fork()<0) { printf("error!"); } else { if(b_pid==0) printf("c\n"); else printf("a\n"); } } 如果是创建两个进程则出现结果 b c a a c a
为什么会返回6个字母??????????? 然后是 anguxiang 的回答: 事实上,理解fork()的关键在于它的返回点在哪里。fork最特殊的地方就在于他有两个甚至三个返回值,注意是同时返回两个值。其中pid=0的这个返回值用来执行子进程的代码,而大于0的一个返回值为父进程的代码块。第一次fork调用的时候生叉分为两个进程,不妨设为a父进程和b子进程。他们分别各自在第二次fork调用之前打印了b和a各一次;在第一次叉分的这两个进程中都含有
if(b_pid=fork()<0) { printf("error!"); } else { if(b_pid==0) printf("c\n"); else printf("a\n"); } }
这段代码。很明显,a父进程和b子进程在这段代码中又各自独立的被叉分为两个进程。这两个进程每个进程又都打印了a,c各一次。到此,在程序中总共打印三次a两次c和一次b。总共6个字母。
注:在第一次叉分为两个进程的时候父子进程含有完全相同的代码(第二次仍然相同),只是因为在父子进程中返回的PID的值不同,父进程代码中的PID的值大于0,子进程代码中的值等于0,从而通过if这样的分支选择语句来执行各自的任务。 结束:向上面提到的高人们致敬!
http://blog.csdn.net/yanh_lzu/archive/2008/04/21/2311644.aspx
发表评论
-
Linux内核源码包的安装及编译zz
2009-12-15 20:58 4267http://my.donews.com/ecco2005/2 ... -
Linux内核Makefile文件(二)
2009-12-15 19:34 2418=== 6 体系Makefile文 ... -
Linux内核Makefile文件(一)
2009-12-15 19:34 1835本文是/Documentation/kbuild/make ... -
Linux加载模块命令
2009-12-15 19:28 2680安装模块insmod *.ko卸载 ... -
linux内核模块编程
2009-12-15 19:25 3557主题: linux内核模块的程序结构--模块加载函数(必须), ... -
编译linux内核~
2009-12-05 22:04 1396小菜鸟第一次编译linux内核。截图太多 。。不方便上传 = ... -
grub2 基础教程
2009-12-05 18:01 2744grub2基础教程-修订版 ... -
Ubuntu9.10版本没有了menu.lst文件!
2009-12-05 18:00 3117囧~现在都在grub下面配置了。 不过麦斯之前的men ... -
关于信号量与线程互斥锁的区别与实现
2009-11-30 14:37 2390之前一直没有怎么 ... -
Linux信号量线程控制
2009-11-30 14:31 3655线程中互斥锁的使用,达到对共享资源互斥使用。除了使用互斥锁, ... -
信号量和自旋锁
2009-11-29 21:56 1630内核同步措施 ... -
Linux信号量semaphore编程实例
2009-11-29 21:20 6541本例示范Linux信号量的基本用法。该范例使用了两个线程分别对 ... -
Linux获取当前时间
2009-11-29 21:16 3638Linux获取当前时间 ... -
pthread库学习(2): 线程的同步,使用信号量
2009-11-29 20:55 2455先看下面这段程序,主线程创建了三个线程,每个线程中均有一个打印 ... -
信号量的基本思想
2009-11-29 20:17 1456信号量是1965荷兰Dijkstra 为了解决并发进程问题 ... -
多进程通信方式一:管道(PIPE)
2009-11-27 18:29 9077进程通信(IPC)的几种方式及比较 撰文:黄显国08 ... -
进程的管道通信
2009-11-27 18:12 2985实验四 进程的管道通信 ... -
Linux下线程的挂起和恢复
2009-11-27 15:42 3704POSIX的Linux操作系统没有提供线程挂起和恢复的例程,在 ... -
Linux 编程之生成静态连接库
2009-11-27 15:41 1389静态库及动态库的建立 ... -
LInux高级编程 - 线程(Threads)
2009-11-27 15:40 1856LInux高级编程 - 线程(Threads) ...
相关推荐
对话 应用程序的模态对话框和弹出窗口提供程序。 ngDialog 很小(~2Kb),具有简约的 API,通过主题高度可定制,并且只有 Angular.js 作为依赖项。 安装 您可以手动下载所有必需的 ngDialog 文件或使用 bower 安装...
目前,它通过 AppleScript 接口与 Spotify 对话,因此目前仅支持 OS X。目标spotify-remote 试图成为一个轻量级的客户端服务器解决方案,用于控制您的 Spotify,尽可能地对电池和移动友好。 目前关于性能的主要问题...
1、【完整版】包含项目源码,和技术文档说明,非常齐全! 2、会部署网址的同学,几分钟就完全可以快速搞定 ...这个产品的部署有很多中方式,最简单的一种就是直接 Fork 项目,然后通过Vercel 一键部署,在部署
软件安全性作业1 服务器过程分为两个过程,一个过程处理来自客户端的请求,另一个过程通过网络进行对话。 当前的实现方式放弃了通过网络与客户端进行通信的过程的特权。 server.c中的更改pipe (pipe_fd);switch ...
不仅能解决所有报错不再刷新,还有保持活跃、取消审计、克隆对话、净化首页、展示大屏、展示全屏、言无不尽、拦截跟踪、日新月异等多个高级功能。让我们的AI体验无比顺畅、丝滑、高效、简洁 原理 利用Headless绕过...
本项目支持 GPT-3.5-turbo 和 GPT-4,支持记录上下文实现连续对话!本项目支持流式响应,markdown 实时转换为 html!由于 OpenAI 的 api 地区限制问题, 使用现有开源 api 代理,则只需在 settings.py 配置文件中加入...
本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶, 或者实际项目借鉴参考! 当然也可作为毕设项目、课程设计、作业、项目初期...
C# 版微信 SDK,封装全部已知的微信 API,包含微信公众平台(订阅号+服务号+小程序+小游戏+小商店+视频号)、微信开放平台、微信商户平台(微信支付+微企付)、企业微信、微信广告平台、微信智能对话开放平台等模块...
fork和git clone或下载为 zip。 unzip和cd 。 npm install 。 安装 livereload 浏览器扩展grunt watch和快乐的编码。咕噜任务HTMLmin HTML提示加Jsmerge JShint 业力萨斯雪碧图像最小手表JS库自动隐藏复选框曲奇饼...
项目地址:,该项目长期维护更新,欢迎star、fork、 pull requests、 issue。 示例项目程序。 来源 是一个非常优秀的开源微信个人号接口,使用Python语言开发,提供了简单易用的API,可以很方便地对个人微信号进行...
我的fork结合了我自己的一些更改,并从其他存储库中拉出以修复主题等。 我不在乎学分,也没有遵守原始的MIT许可证,我留下了任何不需要更改的地方。 可以在我的上找到。 请检查原始页面自述文件以获取有关该应用...
这是官方版本的Fork / Mirror,但是没有OpenWrt的特定更改,例如反馈链接和持续集成脚本。快速运行下载源并更改工作目录启动网络服务器(例如python3 -m http.server ) 在网络浏览器中转到...
里亚克核心 Riak Core是分布式系统框架,是分发数据和扩展规模的基础。 更一般而言,可以将其视为构建分布式,可伸缩,容错应用程序的...问题,问题和错误围绕核心相关内容提出问题或开始对话的方法有很多是围绕Riak
WP-PhotoNav ...您可以通过 WordPress 短代码或通过编辑器顶部的媒体按钮使用 WP-PhotoNav,这将显示类似于您通过插入常见图像所知道的对话。 该对话框无非是自动为您生成短代码。 以下是您的帖子或文章中
fork 这个repo,创建一个分支,checkout那个分支,在proposed/添加PSR,将分支推送到Github,然后发送一个pull request; 或者, 创建一张票以在 Github 上开始讨论; 或者, 在上开始对话。 申请会员资格 你不...
随意 fork 并在您自己的用例中采用它! 为什么是草莓? 草莓很好吃。 但是“Slack Reaction Counter”听起来很无聊。 所以我多加了些水果! 这有什么用? 此用法获取用户配置文件信息,以按用户全名和对话历史...
Rascar-Wechat一个很酷的项目,可以在微信上给文件助手(可以自定义为其他任何好友、群聊、公众号)发文本或者语音消息,来控制树莓派智能小车的前进后退、以及与智能小车进行对话等等,会持续更新功能,欢迎Fork。...
概述还包含NLP任务(例如机器翻译,问题解答和对话系统)的最新结果摘要。 您可以在以下地址找到学习资源: : 。 网站快照如下: 关于这个项目 该项目的主要动机如下: 维护最新的学习资源,以整合与NLP研究相关的...
:fork_and_knife: 食物共享应用程序· 这是一个完整的概念证明,以显示如何影响世界。 该应用针对iOS和Android进行了优化-一种代码,一种爱! 时间范围:从头到生产两个星期 :smiling_face_with_sunglasses: :...
9.5 对话期 184 9.6 控制终端 185 9.7 tcgetpgrp 和tcsetpgrp函数 187 9.8 作业控制 187 9.9 shell执行程序 189 9.10 孤儿进程组 193 9.11 4.3+BSD实现 195 9.12 小结 197 习题 197 第10章 信号 198 10.1 引言 198 ...