子进程中返回缺滚扒0,父进程中返回子进程ID,出错返回伏昌-1
函数签名:
pid_t waitpid(pid_t pid,int* stat_loc,int options)
函数签名:
pid_t getpid(void)
pid_t getppid(void)//用于获取父(parent)进备州程的pid
函数签名:
void eixt(int status)
示例1 创建一个这样的进程
创建一个如下的
分似乎不多。不过觉得用fork做这事还是挺有意御宏渗思的。于是做了。程序如下。
在Gcc下运行通过。enjoy~
/********************************************f(n) = n, n=1,2,3
= f(n-3)*f(n-2)+f(n-1), n>3.
fk,用于计算f(n-3),f(n-2),f(n-1).
f返回值约定:
由于exit()退出码大小被限制为仅一字节,即程序只能返回值在
0~255之间的f(n), 故此约定当计算所得f(n)大于255时,f(n)值
强制重置为0或无效. 遇到其它错误时,也如此.
实现原理: 由exit()返回子进程计算所得f(n). */
#include <sys/types.h>
#include <sys/unistd.h>
#include <sys/wait.h> /*linux API*/
#include <stdio.h> /*C-SL*/
#include <stdlib.h>
int fk( int n)
int f( int n)
int main(int argc,char**argv)
{ if (argc<2) { puts("prog <n>") exit(1) }
int n = atoi(argv[1])
printf("f(%d)=%d\n",n,f(n))
}
int f( int n)
{ if(n<=0) return -1 else if(n<=3) return n
//n>3,f(n)=f(n-3)*f(n-2)+f(n-1).
int fnj3,fnj2,fnj1
if((fnj3=fk(n-3))==0) { printf("f(%d)>255,abort.\n",n-3)
return 0 }
if((fnj2=fk(n-2))==0) { printf("f(%d)>255,abort.\n",n-2)
return 0 }
if((fnj1=fk(n-1))==0) { printf("f(%d)>255,abort.\n"绝启,n-1)
return 0 }
int ret = fnj3*fnj2+fnj1
return ret>255 ? 0 : ret
}
int fk( int n)
{ int ret = fork()
//- - - - in child: 计算f(n),返回f(n)
if (ret==0) { int fn = f(n) exit(fn) }
//- - - - in parent: 获取子进程返回的f(n),并返回.
int cldret pid_t cldpid
if (ret>0) { cldpid = wait(&cldret)
if(cldpid>0) return WEXITSTATUS(cldret) else
if(cldpid==0) puts("wait()-异常:无子进程.")else
puts ("wait()-错误:") return 0 }
镇脊 //- - - - in parent: fork() err
puts ("fork()-错误:") return 0
}
Fork:创建一个和当前进程映像一样的进程可以通过fork( )系统调用:#include <sys/types.h>
#include <unistd.h>
pid_t fork(void)
成功调用fork( )会创建一个新的进程,它几乎与调用fork( )的进程一模一样,这两个进程都会继续运行。在子进程中,成功的fork( )调用会返回0。在父进程中fork( )返搏槐回子基型友进程的pid。如果出现错误,fork( )返回一个负值。
最常见的fork( )用法是创建一个新的进程,然后使用exec( )载入二进制映租李像,替换当前进程的映像。这种情况下,派生(fork)了新的进程,而这个子进程会执行一个新的二进制可执行文件的映像。这种“派生加执行”的方式是很常见的。
在早期的Unix系统中,创建进程比较原始。当调用fork时,内核会把所有的内部数据结构复制一份,复制进程的页表项,然后把父进程的地址空间中的内容逐页的复制到子进程的地址空间中。但从内核角度来说,逐页的复制方式是十分耗时的。现代的Unix系统采取了更多的优化,例如Linux,采用了写时复制的方法,而不是对父进程空间进程整体复制。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)