Linux fork()系统调用
来源:互联网 发布:sql 商业智能 编辑:程序博客网 时间:2024/05/16 13:58
需要头文件: #include <unistd.h> // man 2 fork 查看需要什么头文件
函数原型:pid_t fork(void); //这里pid_t 就是整形 其在#include<sys/types.h>
函数返回值:-1 出错。成功后其在子进程中返回0,父进程中返回子进程pid。这里可以理解为fork执行成功后其返回子进程pid,如果没有子进程则返回0。
fork()执行成功后,向父进程返回子进程的PID,并向子进程返回0,这意味着fork即使只调用一次,会返回两次。
使用fork()函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个地址空间,包括进程上下文、代码段、进程堆栈段、内存信息、打开的文件描述符等系统分配的资源。而子进程所独有的只是它的进程号、资源使用计时器等。
看下面程序。
/* * main.c * * Created on: 2015-1-29 * Author: hsc */#include <stdio.h>#include <stdlib.h>#include<unistd.h>#include<sys/types.h>#include <string.h>#include <errno.h>int main(void){printf("---begin--- \n"); /* prints begin */pid_t pid = fork();if(pid == -1){printf("%s \n", strerror(errno));return -1;}if(pid == 0){printf("child \n");}else{printf("parent \n");}printf("---end---- \n");return 0;}
只打印了一个begin而不是两个begin,子进程是对父进程拷贝,其代码区也是从父进程拷贝的,但是其代码是从fork()以后开始执行,但是值得注意的是
如果上面程序中
printf("---begin--- ")//去掉换行符,则会输出两个begin 这是因为printf("--begin---") 输出到了缓冲区,fork后由于子进程是父进程的拷贝(包括缓冲区)其会输出两个begin,这个可以加换行\n 或者使用fflush(stdout),来避免这种问题。
腾讯2013校园招聘技术类笔试题
11.请问下面的程序一共输出多少个“-”(D)
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i=0; i<2; i++) { fork(); //复制父进程,调用一次,返回两次 printf("-"); //缓冲区数据 } return 0; }
A.2个 B .4个 C.6个 D.8个
printf(“-”);语句有buffer,所以,对于上述程序,printf(“-”);把“-”放到了缓存中,并没有真正的输出,在fork的时候,缓存被复制到了子进程空间,所以,就多了两个,就成了8个,而不是6个。
fork作用:
1.做服务程序,服务程序是不依赖与控制台的,目前写的程序依赖于控制台的,控制台关闭后进程也就会关闭。父进程直接退出,子进程还在后台运行,关闭终端程序也还在执行。
2.如果两个进程同时访问一个文件描述符,fork后文件描述符是共享的close(fd) 并不是直接把文件描述符关闭,只是把文件引用描述符减一 ,当引用为0则关闭它。
0 0
- linux fork系统调用
- linux 系统调用fork
- Linux fork()系统调用
- Linux中fork系统调用
- Linux系统调用fork()用法详解
- linux系统调用fork, vfork, clone
- linux系统调用fork, vfork, clone
- [转]linux系统调用fork, vfork, clone
- Linux系统调用fork,vfork,clone
- Linux系统调用fork()用法详解
- linux 系统调用fork vfork clone
- linux中fork()系统调用总结
- linux系统调用fork()总结(二)
- linux系统调用函数心得:fork()
- linux: fork系统调用实现剖析
- linux系统调用之-fork、wait、waitpid
- linux下fork系统调用的实现
- fork系统调用
- windows 监控文件目录
- Missing number
- BestCoder#28两道水题 HDU5166&&5167
- Local Broadcast Manager
- seam @Factory
- Linux fork()系统调用
- 在64位ubuntu中安装代码比较工具beyond compare
- 诡异的EOF Exception
- iOS7 Programming Cookbook-Chapter 7:Concurrency(Block部分)
- C++ string类的简介
- 对于SQL SERVER中评估期已过的处理方法
- 工作日志---2015.1.30
- iOS7 Programming Cookbook-Chapter 7:Concurrency(GCD部分)
- LeetCode-Symmetric Tree