2016-11-11 15 views
0

我有一個簡單的函數,它創建一個子進程,等待它完成並打印CPU系統和用戶時間。帶有wait4()的Rusage沒有顯示完成的子進程的CPU時間

int PrintChildProcessTime(char **arg) 
{ 
    pid_t pid; 
    int status; 
    struct rusage usage; 

    if ((pid=fork()) == 0) 
    { 
     execvp(arg[0],arg); 

     perror("Execvp error"); 
     _exit(1); 
    } 
    else if (pid > 0) 
    { 
     wait4(pid, &status, 0, &usage); 
     printf ("CPU time: %ld.%06ld sec user, %ld.%06ld sec system\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec, usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 
    } 
    else 
    { 
     perror("Fork error"); 
     _exit(2); 
    } 
} 

的事情是,即使我通過sleep 10**arg和父進程等待子結束,然後它仍然顯示在系統和用戶CPU時間0.000000。

我在做什麼錯? 謝謝你的幫助。

回答

1

這是因爲子進程花費時間在用戶空間或內核空間中。 sleep只是簡單地掛起了調用進程,並沒有導致任何CPU使用率。

取而代之的是讓您的子進程執行某些操作,您將看到CPU時間。

例如,有一個腳本叫myscript有:

#!/bin/bash 

for((i=0;i<1000000;i++)); do 
    echo hi >/dev/null 
done 

並執行它作爲孩子理線,這將表現出一定的CPU使用率。

相關問題