fork

How to use Fork() to create only 2 child processes?

孤街浪徒 提交于 2020-01-20 00:45:04
问题 I'm starting to learn some C and while studying the fork, wait functions I got to a unexpected output. At least for me. Is there any way to create only 2 child processes from the parent? Here my code: #include <sys/types.h> #include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main () { /* Create the pipe */ int fd [2]; pipe(fd); pid_t pid; pid_t pidb; pid = fork (); pidb = fork (); if (pid < 0) { printf ("Fork Failed\n"); return -1; } else if (pid == 0) { //printf("I'm the child\n

linux中fork函数入门

江枫思渺然 提交于 2020-01-19 22:17:40
linux中fork()函数详解 一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。 我们来看一个例子: [cpp] view plain copy /* * fork_test.c * version 1 * Created on: 2010-5-29 * Author: wangth */ #include <unistd.h> #include <stdio.h> int main () { pid_t fpid; //fpid表示fork函数返回的值 int count=0; fpid=fork(); if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d/n",getpid()); printf("我是爹的儿子/n");/

fork() and output

限于喜欢 提交于 2020-01-18 15:49:47
问题 I have a simple program: int main() { std::cout << " Hello World"; fork(); } After the program executes my output is: Hello World Hello World . Why does this happen instead of a single Hello world ? I'm guessing that the child process is rerun behind the scenes and the output buffer is shared between the processes or something along those lines, but is that the case or is something else happening? 回答1: This isn't quite what you thought originally. The output buffer is not shared - when you

fork() and output

穿精又带淫゛_ 提交于 2020-01-18 15:49:45
问题 I have a simple program: int main() { std::cout << " Hello World"; fork(); } After the program executes my output is: Hello World Hello World . Why does this happen instead of a single Hello world ? I'm guessing that the child process is rerun behind the scenes and the output buffer is shared between the processes or something along those lines, but is that the case or is something else happening? 回答1: This isn't quite what you thought originally. The output buffer is not shared - when you

从一道面试题谈Linux下fork的运行机制

余生长醉 提交于 2020-01-18 06:52:07
今天一位朋友去一个不错的外企面试linux开发职位,面试官出了一个如下的题目: 给出如下C程序,在Linux下使用gcc编译: # include "stdio.h" # include "sys/types.h" # include "unistd.h" int main ( ) { pid_t pid1 ; pid_t pid2 ; pid1 = fork ( ) ; pid2 = fork ( ) ; printf ( "pid1:%d, pid2:%d\n" , pid1 , pid2 ) ; } 要求如下: 已知从这个程序执行到这个程序的所有进程结束这个时间段内,没有其它新进程执行。 1、请说出执行这个程序后,将一共运行几个进程。 2、如果其中一个进程的输出结果是“pid1:1001, pid2:1002”,写出其他进程的输出结果(不考虑进程执行顺序)。 明显这道题的目的是考察 Linux 下 fork 的执行机制。 下面我们通过分析这个题目,谈谈linux下fork的运行机制。 预备知识 这里先列出一些必要的预备知识,对linux下进程机制比较熟悉的朋友可以略过。 1、进程可以看做程序的一次执行过程。在linux下,每个进程有唯一的PID标识进程。PID是一个从1到32768的正整数,其中1一般是特殊进程init,其它进程从2开始依次编号。当用完32768后

多任务,多进程

落花浮王杯 提交于 2020-01-18 05:29:41
多任务 多任务就是同一时刻多个任务同时执行,例如开演唱会时明星一边唱歌一边跳舞,开车时眼 睛看路手操作方向盘。这些都是多任务场景。对于电脑来说多任务就是同时运行多个应用程序,例如qq、微信、浏览器等等同时在电脑上 运行。 那多任务用代码怎么实现呢? 直接上代码 最好linux运行 #windowns 不支持 linux 支持 import os import time ret = os . fork ( ) if ret == 0 : while True : print ( "-----1-----" ) time . sleep ( 1 ) else : while True : print ( "-----2-----" ) time . sleep ( 1 ) #gitpid 得到自己的进程号 getppid 得到父类的进程号 父子进程先后顺序 import os import time t = os . fork ( ) if t == 0 : print ( "------子进程----" ) time . sleep ( 5 ) print ( "-----子进程over----" , end = "" ) else : print ( "-----父进程-----" ) #父进程不会因为子进程没进行完而等 什么是进程 我们想通过酷我听歌

Fork/Join框架

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-18 03:17:04
如果我们需要处理一大批数据,但是没有处理这批数据的能力,就可以使用分而治之的方式.fork/join框架就是对这种方式的体现. ForkJoinTask 接口的实现类: RecursiveTask 有返回值 RecursiveAction 无返回值 demo: import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask; public class TestForkJoin{ /** * ForkJoinTask 接口下的继承类 RecursiveTask 有返回值 * RecursiveAction 无返回值 * * 计算求和 */ private static class TaskDemo extends RecursiveTask<Long> { //继承RecursiveTask private static final int NUM = 10; //数据个数大于10 则使用分而治之 方式

面试官常问的Nginx的几个问题

99封情书 提交于 2020-01-17 21:38:14
1.什么是Nginx? Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器 目前使用的最多的web服务器或者代理服务器,像淘宝、新浪、网易、迅雷等都在使用 2.为什么要用Nginx? 优点: * 跨平台、配置简单 * 非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发 * 内存消耗小:开启10个nginx才占150M内存 成本低廉:开源 * 内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。 * 节省宽带:支持GZIP压缩,可以添加浏览器本地缓存 * 稳定性高:宕机的概率非常小 * master/worker结构:一个master进程,生成一个或者多个worker进程 * 接收用户请求是异步的:浏览器将请求发送到nginx服务器,它先将用户请求全部接收下来,再一次性发送给后端web服务器,极大减轻了web服务器的压力 * 一边接收web服务器的返回数据,一边发送给浏览器客户端 * 网络依赖性比较低,只要ping通就可以负载均衡 * 可以有多台nginx服务器 * 事件驱动:通信机制采用epoll模型 3.为什么Nginx性能这么高?

Redis学习笔记(2)

会有一股神秘感。 提交于 2020-01-16 21:02:06
8.Redis的持久化 两种策略的选择: RDB持久化方式能够在指定的时间间隔内对数据进行快照存储。AOF持久化方式记录每次对服务器的写操作,当服务器重启时会重新执行这些写命令来恢复原始的数据,AOF命令以redis协议追加保存每次写操作到文件末尾。 Redis能对AOF文件进行后台重写,使得AOF文件体积不会过大 只做缓存:如果希望数据在服务器运行的时候存在,也可以不使用任何持久化方式。 官网建议如果使用,两种同时使用: 在这种情况下,redis先载入AOF文件来恢复原始数据,因为通常AOF数据比RDB数据更完整。当RDB数据不正确时,服务器重启也只会加载AOF文件。RDB用于备份数据库,快速重启,以防万一。 性能建议 RDB(Redis DataBase) 定义:在指定的时间间隔内将内存中的数据集快照写入磁盘,Snapshot快照,它恢复时是将快照文件直接读到内存里。 Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。 Fork 作用是复制一个与当前进程一样的进程

php多进程编程

爱⌒轻易说出口 提交于 2020-01-16 15:20:35
php多进程编程 PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断。 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。 pcntl函数 pcntl_fork() :在当前进程当前位置产生分支(子进程)。译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0 <?php $pid = pcntl_fork(); //父进程和子进程都会执行下面代码 if ($pid == -1) { //错误处理:创建子进程失败时返回-1. die('could not fork'); } else if ($pid) { //父进程会得到子进程号,所以这里是父进程执行的逻辑 pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。 } else { //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。 exit();//子进程执行完后应该退出,不然会继续执行后面的逻辑 } pcntl_wait(int &$status[, int $options = 0]) :等待或返回fork的子进程状态,相当于pcntl_waitpid(-1,int &$status[,int