赞
踩
- #include<unistd.h>
- pid_t fork(void);
成功时返回进程ID,失败时返回-1
fork函数将创建调用的进程的副本,并非根据完全不同的程序创建进程,而是复制正在运行的。调用fork函数的进程。两个进程都将执行fork函数调用后的语句,但因为通过同一个进程、复制相同的内存空间,之后的程序流根据fork函数的返回值加以区分:
1.父进程:fork函数返回子进程ID- #include<stdio.h>
- #include<unistd.h>
-
- int gval=10;
- int main()
- {
- pid_t pid;
- int lval=20;
- gval++,lval++;
- pid=fork(); //创建子进程,父进程的pid中存有子进程的ID,子进程的pid是0
- if(pid==0){ //子进程执行
- gval+=2,lval+=2;
- printf("I am a child \n");
- }
- else{ //父进程执行
- gval-=2,lval-=2;
- printf("I am a parent \n");
- }
- if(pid==0)
- printf("Child Proc:[%d,%d] \n",gval,lval);
- else
- printf("Parent Proc:[%d,%d] \n",gval,lval);
- return 0;
- }
- #include<sys/wait.h>
- pid_t wait(int *statloc)
成功时返回终止的子进程ID,失败时返回-1
调用此函数时如果已有子进程终止,那么子进程终止时传递的返回值(exit函数的参数值、main函数的return返回值)将保存到该函数的参数所指内存空间。但函数参数指向的单元中还包含其他信息,因此需要通过下列宏进行分离。
1.WIFEXITED子进程正常终止时返回“真”(true)- #include<stdio.h>
- #include<stdlib.h>
- #include<unistd.h>
- #include<sys/wait.h>
- int main()
- {
- int status;
- pid_t pid=fork();
- if(pid==0)return 3;
- else{
- printf("Child PID:%d \n",pid);
- pid=fork();
- if(pid==0)exit(7);
- else{
- printf("Child PID:%d \n",pid);
- wait(&status); //调用wait函数,之前终止的子进程相关信息将保存到status变量,同时相关子进程被完全销毁
- if(WIFEXITED(status))
- printf("Child send one:%d \n",WEXITSTATUS(status));
- wait(&status);
- if(WIFEXITED(status))
- printf("Child send two:%d \n",WEXITSTATUS(status));
- sleep(30);
- }
- }
- return 0;
- }
- #include<sys/wait.h>
- pid_t waitpid(pid_t pid,int *statloc,int options)
成功时返回终止的子进程ID,失败时返回-1
options---传递头文件sys/wait.h中声明的产量WNOHANG,即使没有终止的子进程也不会进入阻塞状态,而是返回0并退出函数
- #include<stdio.h>
- #include<unistd.h>
- #include<sys/wait.h>
- int main()
- {
- int status;
- pid_t pid=fork();
- if(pid==0){
- sleep(15);
- return 24;
- }
- else{
- while(!waitpid(-1,&status,WNOHANG)){ //while循环中调用waitpid函数,向第三个参数传递WNOHANG,因此,若之前没有终止的子进程将返回0
- sleep(3);
- puts("sleep 3sec.");
- }
- if(WIFEXITED(status))
- printf("child send %d \n",WEXITSTATUS(status));
- }
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。