2016-01-21 90 views
6

我試圖找到fork()系統調用的運行時間。每個子進程需要立即退出,並且在創建下一個子進程之前父進程需要對wait()。我還想使用名爲time的shell內置命令來測量程序的執行時間。如何計算C中fork()系統調用的運行時間?

到目前爲止我有這個代碼,但不知道如果我做對了。

#include <sys/types.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 

int global = 100; 

int main(int argc, char** argv) 
{ 
    int local = 5; 

    pid_t pid; 

    pid = fork(); 
    if (pid < 0) { 
     fprintf(stderr, "error -- failed to fork()"); 
     return 1; 
    } 

    if (pid > 0) { 

     int child_ret; 

     waitpid(pid, &child_ret, 0); 
     printf("parent -- global: %i, local: %i\n", global, local); 
     printf("parent -- child exited with code %i\n", child_ret); 
    } else { 
     global++; 
     local++; 

     printf("child -- global: %i, local: %i\n", global, local); 
     exit (0); 
    } 
} 
+2

請查看' getrusage'系統調用。 – Kaz

+0

代碼是否工作?如果是的話,你應該在codereview.stackexchange.com上發佈。如果代碼不起作用,請準確地說出您的想法:您觀察到什麼錯誤或意外行爲? –

+0

你很可能會感到困惑,因爲'local'和'global'不會改變你的父進程,但是,你的代碼看起來是正確的。 – tkausl

回答

2

閱讀第一time(7),並考慮使用clock_gettime(2) & getrusage(2);如果您只需要測量系統調用本身的時間(它非常小 - 也許是毫秒 - 並且不是真正重要),則可以在fork(在父進程中)周圍使用clock_gettime

在故障情況下使用errno(例如,打印strerror(errno)或使用perror)。

請注意,fork時間可能會略微取決於您的virtual address spaceresident set size的大小。你也可以使用strace時機;在實踐中fork足夠快(通常,小於一毫秒,有時幾十微秒的,因爲它是用懶惰copy-on-write技術)

所以fork快,孩子execve可能需要幾微秒,孩子中的程序啓動時間也很重要(ld-linux(8)正在執行一些relocation,然後的exec -ed程序啓動......)。 什麼準確你想衡量?

一般來說,子進程很快跟execve(2)這也需要一定的時間(當然還有執行的程序可能需要一段任意長的時間才能完成,並且可能甚至「從來沒有」完成,如果它是服務器等)。也許最重要的是fork之間的時間和子過程中execve -d main的第一個有意義的指令......

事實上,你可以啓動很多進程;經驗法則是fork每秒最多幾百倍,且僅當孩子快速execve -ing一些快速程序(如的幾十個文件/bin/ls,或date)。但是,您不希望一次(在筆記本電腦或臺式機上)運行多個或兩個以上的進程,甚至可能少於5個可運行進程...