1. 程式人生 > >C++多程序,迴圈fork詳解

C++多程序,迴圈fork詳解

因為我們現在要處理31個省的資料,但是每個省的資料量都很大,順序執行是在太慢了。本來想用多執行緒,但是都是類裡面的方法,用起來也很扯淡,所以就選擇了多程序。

fork()函式

#include <unistd.h>
//On success, The PID of the process is returned in the parent, and 0 is returned in the child. On failure,
//-1 is returned in the parent, no child process is created, and errno is set appropriately.
pid_t fork (void);

在作業系統的基本概念中程序是程式的一次執行,且是擁有資源的最小單位和排程單位(在引入執行緒的作業系統中,執行緒是最小的排程單位)。在Linux系統中建立程序有兩種方式:一是由作業系統建立,二是由父程序建立程序(通常為子程序)。系統呼叫函式fork()是建立一個新程序的唯一方式,當然vfork()也可以建立程序,但是實際上其還是呼叫了fork()函式。fork()函式是Linux系統中一個比較特殊的函式,其一次呼叫會有兩個返回值,下面是fork()函式的宣告:

當程式呼叫fork()函式並返回成功之後,程式就將變成兩個程序,呼叫fork()者為父程序,後來生成者為子程序。這兩個程序將執行相同的程式文字,但卻各自擁有不同的棧段、資料段以及堆疊拷貝。子程序的棧、資料以及棧段開始時是父程序記憶體相應各部分的完全拷貝,因此它們互不影響。從效能方面考慮,父程序到子程序的資料拷貝並不是建立時就拷貝了的,而是採用了寫時拷貝(copy-on -write)技術來處理。呼叫fork()之後,父程序與子程序的執行順序是我們無法確定的(即排程程序使用CPU),意識到這一點極為重要,因為在一些設計不好的程式中會導致資源競爭,從而出現不可預知的問題。

#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include<vector>
#include <iostream>

using namespace std;
int main()
{
    string sMatch;
    pid_t pid;
    vector<string> provList;
    provList.push_back("100");
    provList.push_back("200");
    provList.push_back("300"
); provList.push_back("400"); provList.push_back("500"); cout<<"main process,id="<<getpid()<<endl; //迴圈處理"100,200,300,400,500" for (vector<string>::iterator it = provList.begin(); it != provList.end(); ++it) { sMatch=*it; pid = fork(); //子程序退出迴圈,不再建立子程序,全部由主程序建立子程序,這裡是關鍵所在 if(pid==0||pid==-1) { break; } } if(pid==-1) { cout<<"fail to fork!"<<endl; exit(1); } else if(pid==0) { //這裡寫子程序處理邏輯 cout<<"this is children process,id="<<getpid()<<",start to process "<<sMatch<<endl; sleep(10); exit(0); } else { //這裡主程序處理邏輯 cout<<"this is main process,id="<<getpid()<<",end to process "<<sMatch<<endl; exit(0); } return 0; }

執行效果如下圖:
這裡寫圖片描述

相關推薦

C++程序迴圈fork

因為我們現在要處理31個省的資料,但是每個省的資料量都很大,順序執行是在太慢了。本來想用多執行緒,但是都是類裡面的方法,用起來也很扯淡,所以就選擇了多程序。 fork()函式 #include <unistd.h> //On success,

Linux 工程式設計——程序:vfork() 函式

所需標頭檔案: #include <sys/types.h> #include <unistd.h> pid_t vfork(void); 功能: vfork() 函式和 fork() 函式(fork()如何使用,請點此連結)一樣都是在已有的

Python 程序 multiprocessing.Pool類

multiprocessing模組 multiprocessing包是Python中的多程序管理包。它與 threading.Thread類

C++執行緒函式CreateThread()

採用CreateThread()建立多執行緒程式 原創 2012年12月10日 11:44:59

c語言—棧區堆區全局區文字常量區程序代碼區

註意 進制 但是 ack int 運行時 內存區域 否則 數組 轉:http://www.cnblogs.com/xiaowenhui/p/4669684.html 一、預備知識—程序的內存分配 一個由C/C++編譯的程序占用的內存分為以下幾個部分1、棧區(stack)—

Linux 工程式設計——程序建立:fork() 和vfork() 函式

一、fork() 函式詳解 需要的標頭檔案: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 功能: 用於從一個已存在的程序中建立一個新程序,新程序稱為子程序,原程序稱為父程序。

Python 程序 fork()

程序 程序是程式的一次動態執行過程,它對應了從程式碼載入、執行到執行完畢的一個完整過程。程序是系統進行資源分配和排程的一個獨立單位。程序是由程式碼(堆疊段)、資料(資料段)、核心狀態和一組暫存器組成。 在多工作業系統中,通過執行多個程序來併發地執行多個任務。

Eureka 2.X 停止開發但註冊中心還有更選擇:Consul 使用

轉發 困難 oos work 安全 關註 新版本 復制 zookeep 在上個月我們知道 Eureka 2.X 遇到困難停止開發了,但其實對國內的用戶影響甚小,一方面國內大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支持很多服務發現的軟件,E

07_Linux中的程序管理問題簡單圖文

什麼是程序 程序是作業系統中非常重要的一個概念,程序是程式的執行過程啊,程序同時也是動態的,在linux系統中,他與使用者許可權有關係,但是程式與程序並沒有相互對應,一個程式可能對應多個程序 子程序與父程序:一個程序產生另外一個程序,產生的程序稱為子

nohup和&後臺執行程序檢視及終止

 nohup 和重定向 功能一樣,可用於定時啟動 1.nohup 用途:不掛斷地執行命令。 語法:nohup Command [ Arg … ] [ & ]   無論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當前目錄的 n

Linux C程式設計--fork

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Spring Cloud:Eureka 2.X 停止開發但註冊中心還有更選擇:Consul 使用(13)

在上個月我們知道 Eureka 2.X 遇到困難停止開發了,但其實對國內的使用者影響甚小,一方面國內大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支援很多服務發現的軟體,Eureka 只是其中之一,下面是 Spring Cloud 支援的服務發現軟體以及特性對比:

js網站國際化國語言切換【

JS網站國際化,多國語言切換【詳解】 作者:Anmbition 在web開發過程中通常會碰到需要多國語言支援的需求,我也看過一些文件,但寫的都不盡人意,最終我整理了一套通過js程式碼完成解決方案,並對程式碼進行了很大程度的優化,在使用過程中只需極少的程式碼即可完成。 第一步:核心JS

C/C++結構體對齊方式從記憶體地址進行解析

注意:童鞋們如果仔仔細細看完這篇部落格,肯定能明白結構體的對齊方式。 最近在做一個專案的時候,客戶給的鐳射點雲檔案是二進位制形式,因此需要根據客戶定義的結構體,將點雲檔案儲存為文字檔案方便在第三方軟體如cloudCompare中檢視。但是發現客戶的結構體所佔記憶體空間跟我的

springcloud(十三):Eureka 2.X 停止開發但註冊中心還有更選擇:Consul 使用

在上個月我們知道 Eureka 2.X 遇到困難停止開發了,但其實對國內的使用者影響甚小,一方面國內大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支援很多服務發現的軟體,Eureka 只是其中之一,下面是 Spring Cloud 支援的服務發現軟體以及特性對比: Fea

linux部署個tomcat埠修改linux埠開放訪問

一、sever.xml需要修改的地方:1、<Server port="8005" shutdown="SHUTDOWN">2、<Connector port="8080" protocol="HTTP/1.1"               connectio

C語言檔案操作

在 C 語言中,檔案操作的函式大多包含在 標頭檔案中,使用時記得 #include。 一、開啟和關閉檔案 1. 開啟檔案 FILE * fopen ( const char * filename, const char * mode ); 開啟一個檔案,成功則返回

第四天:JAVA中的迴圈語句和常用例子

1:switch語句(掌握)(1)格式:switch(表示式) {case 值1:語句體1;break;case 值2:語句體2;break;...default:語句體n+1;break;}格式解釋說明:switch:說明這是switch語句。表示式:可以是byte,short,int,charJDK5以後

C++ 記憶體分配(newoperator new)

    在SGI STL原始碼中,defalloc.h和stl_construct.h中提供了最簡單的空間配置器(allocator)封裝,見《STL原始碼剖析》P48。它將物件的空間分配和構造分離開來,雖然在defalloc.h中僅僅是對::operator new和::operator delete的一層

c++裡面的值傳遞指標傳遞地址傳遞

c++裡面的值傳遞: //將i和j的值傳給a和b,實參傳給形參,但由於形參不會回傳給實參,故輸出i仍為38,j仍為45 void main(){void swap(int, int);int i =