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
原创粉丝点击