例子:
#include
#include
#include
#include
#include
#include
#include
int variable,fd;
int do_something(){
variable = 42;
printf("in child process
");
close(fd);
return 0;
}
int main(int argc, char *argv[]){
void *child_stack;
char tempch;
variable = 9;
fd = open("/test.txt",O_RDONLY);
child_stack = (void *)malloc(16384);
printf("The variable was %d
",variable);
clone(do_something, child_stack+10000, CLONE_VM |CLONE_FILES,NULL);
sleep(3); /* 延时以便子进程完成关闭文件操作、修改变量 */
printf("The variable is now %d
",variable);
if(read(fd,&tempch,1) < 1){
perror("File Read Error");
exit(1);
}
printf("We could read from the file
");
return 0;
}
运行结果:
the value was 9
in child process
The variable is now 42
File Read Error
sleep函数
进程挂起指定的秒数,直到指定的时间用完或者收到信号才解除挂起。注意:进程挂起指定的秒数后程序并不会立即执行,系统只是将此进程切换到了就绪态。
wait函数
工作原理:
父进程调用wait函数后阻塞,子进程结束时,系统向其父进程发送SIGCHILD信号。父进程被SIGCHILD信号唤醒然后去回收僵尸子进程,父子进程之间是异步的,SIGCHILD信号机制就是为了解决父子进程之间的异步通信问题,让父进程可以及时的去回收僵尸子进程。若父进程没有任何子进程则wait返回错误。当前进程有可能有多个子进程,wait函数阻塞直到其中一个子进程结束wait就会返回,wait的返回值就可以用来判断到底是哪一个子进程本次被回收了。
pid_t wait(int *status);
功能:等待子进程终止,如果终止了,此函数会回收子进程的资源。调用wait函数的进程会挂起,直到它的一个子进程退出或收到一个不能被忽视的信号时才被唤醒。
若调用进程没有子进程或它的子进程已经结束,该函数立即返回。
参数:函数返回时,参数status中包含子进程退出时的状态信息。子进程的退出信息在一个int中包含了多个字段,用宏定义可以取出其中的每个字段。
返回值:如果执行成功则返回子进程的进程号,出错返回-1,失败原因存于errno中。
1、WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的,如果是,它会返回一个非零值。
2、WEXITSTATUS(status) 当WIFEXITED返回非零值时,我们可以用这个宏来提取子进程的返回值,如果子进程调用exit(5)退出,WEXITSTATUS(status) 就会返回5;如果子进程调用exit(7),WEXITSTATUS(status)就会返回7。请注意,如果进程不是正常退出的,也就是说, WIFEXITED返回0,这个值就毫无意义。
waitpid函数
pid_t waitpid(pid_t pid, int *status,int options)
- pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
- pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
- pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
- pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。
options提供了一些额外的选项来控制waitpid,参数option可以为0或可以用"|"运算符把它们连接起来使用,比如:ret=waitpid(-1,NULL,WNOHANG | WUNTRACED);
如果我们不想使用它们,也可以把options设为0,如:ret=waitpid(-1,NULL,0);
- WNOHANG 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若结束,则返回该子进程的ID。
- WUNTRACED 若子进程进入暂停状态,则马上返回,但子进程的结束状态不予以理会。WIFSTOPPED(status)宏确定返回值是否对应于一个暂停子进程。