举例讲解C语言的fork()函数创建子进程的用法
先来看这样一个例子,利用fork调用execlp()函数来在Linux下实现ps或ls命令: #include "sys/types.h" #include "unistd.h" #include "stdio.h" #include "stdlib.h" int main() { pid_t result; result=fork(); //报错处理 if(result==-1) { printf("Fork Errorn"); } //son else if(result==0) {//调用execlp()函数,相当于"ps -ef" if((result=execlp("ps","ps",NULL))<0); printf("sonn"); } //father else { if((result=execlp("ls","ls",NULL))<0); printf("fathern"); } } 一般来讲,我们编写1个普通的c程序,运行这个程序直到程序结束,系统只会分配1个pid给这个程序,也就就说,系统里只会有一条关于这个程序的进程. int fork_3(){ printf("it's the main process step 1!!nn"); fork(); printf("step2 after fork() !!nn"); int i; scanf("%d",&i); //prevent exiting return 0; } 在这个函数里,共有两条printf语句,但是执行执行时则打出了3行信息. 如下图: 为什么呢,因为fork()函数将这个程序分叉了啊, 见下面的图解: 可以见到程序在fork()函数执行时都只有1条主进程,所以 step 1 会被打印输出1次. 如上图,pid 8808 那个就是主进程了,而 pid 8809那个就是子进程啊,因为它的parent pid是 8808啊! 区别分主程序和子程序 int fork_1(){ int childpid; int i; if (fork() == 0){ //child process for (i=1; i<=8; i++){ printf("This is child processn"); } }else{ //parent process for(i=1; i<=8; i++){ printf("This is parent processn"); } } printf("step2 after fork() !!nn"); } 我对fork() 函数的返回值进行了判断,如果 返回值是0,我就让认为它是子进程,否则是主程序. 那么我就可以让这两条进程输出不同的信息了. 可以见到 子程序和主程序分别输出了8条不同的信息, 但是它们并不是规则交替输出的,因为它们两条进程是互相平行影响的,谁的手快就在屏幕上先输出, 每次运行的结果都有可能不同哦. 由图解知两条进程都对fork()返回值执行判断, 在if 判断语句中分别执行各自的代码. 但是if判断完成后, 还是会回各自执行接下来的代码. 所以 step2 还是输出了2次. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |