2017-02-19 105 views
1

美好的一天。 我正在創建一個多線程程序,它將讀取關於您將使用PID號指向的進程的基本日期。 而其中一個線程應從「status」文件中讀取信息。這個文件在/proc/NUMBER_PID/status
所以我寫了這個pthread函數。但我仍然犯了一個錯誤。任何人都可以指出問題在哪裏?LINUX C編程中的文件路徑

pthread_create(&pth[1],NULL,odczyt,&pid); 
..... 
##define NUMBER arg 
void *odczyt(void*arg) 
{ 
    char*bufor; 
    FILE *plik; 
    plik=fopen("/proc/NUMBER/status","r"); 
    if(plik==0){ 
     perror("Error: Blad otwarcia pliku"); 
     exit(1); 
    } 
    while((fgets(bufor,200,plik))!=0) 
    { 
     printf("%s",bufor); 
    } 
    fclose(plik); 
    free(bufor); 
} 
+0

你得到的錯誤是什麼 – Sarvex

+0

你的錯誤究竟是什麼? –

+1

@maciekkov你試過它只是一個無螺紋的版本?你如何獲得/ proc/NUMBER成爲pid? NUMBER不會按照您擁有的方式展開到pid中。 –

回答

1

你在你的代碼有很多的問題,

##define NUMBER arg 
/* ^^^^^^^^^^^^^^^^^^^ what is this define? */ 

void *odczyt(void*arg) 
{ 
    char*bufor; 
    /*^^^^^^^^^^^^ this is never malloc'd */ 

    FILE *plik; 
    plik=fopen("/proc/NUMBER/status","r"); 
    /* you never use ^^^^^^^^ the pid */ 

你不與PID

if(plik==0){ 
     perror("Error: Blad otwarcia pliku"); 
     exit(1); 
    } 
    while((fgets(bufor,200,plik))!=0) 
    { 
     printf("%s",bufor); 
    } 
    fclose(plik); 
    free(bufor); 
/* ^^^^^^^^^^^ free'ing something you never malloc'd */ 
} 
更換號碼把PID的路徑運行

嘗試:

void *odczyt(void*arg) 
{ 
    char bufor[256]; 
    FILE *plik; 
    char statusFile[256]; 
    snprintf(statusFile, sizeof(statusFile), "/proc/%u/status", *(pid_t *)arg)); 
    plik=fopen(filename,"r"); 
    if(!plik){ 
     perror("Error: Blad otwarcia pliku"); 
     exit(1); 
    } 
    while((fgets(bufor, sizeof(bufor),plik))!=0) 
    { 
     printf("%s",bufor); 
    } 
    fclose(plik); 
} 
+0

其工作:)謝謝。 但編輯改進你的代碼,只是一個Gramar。')'和結束snprintf函數 並重命名filename到statusFile裏面plik = fopen .... – maciekkov

+0

你能解釋我爲什麼即使當我做這個 plik = fopen(「/ proc/argv [1]/status」 , 「R」);它不工作? 和shell中我打字像第二參數PID我的Firefox。 – maciekkov

0

您試圖打開文件/proc/arg/status,因爲您使用處理器來創建路徑。你應該使用E,G sprintf

+1

更好地使用'snprintf'是因爲'sprintf'可能會緩衝溢出。 –

+0

Takzrobiłemdzięki:) – maciekkov

0

此行是錯誤的(讀小心LYproc(5) ...)

plik=fopen("/proc/NUMBER/status","r"); 

你可能想(如果你關心自己的過程):

如果你是
plik = fopen("/proc/self/status", "r"); 
if (!plik) {perror("/proc/self/status"); exit(EXIT_FAILURE); } 

(以上fopen是不可能的失敗,但可能發生文件描述符之外)

或者,如果您關心其他某個給定的過程pid(聲明爲pid_t pid;並適當計算),則需要計算機a字符串(例如在下面的代碼塊pathname)包含適當的路徑(什麼是將從/proc/$pid/status擴大;瞭解globbing):

char pathname[80]; 
snprintf(pathname, sizeof(pathname), "/proc/%d/status", (int)pid); 
plik = fopen(pathname, "r"); 
if (!plik) {perror(pathname); exit(EXIT_FAILURE); } 

與所有的警告&調試信息編譯代碼(如gcc -Wall -Wextra -g),然後使用調試器gdb

(你真的需要知道如何使用調試器,所以需要幾個小時或幾天來學習how to use gdb

+0

這工作正常..感謝 – maciekkov

+0

其實我扯你的代碼,有什麼不對的地方可以看看嗎? 的#include 的#include INT主(INT的argc,焦炭** argv的) { 炭bufor [100]; \t char * bufor2; (bufor,sizeof(bufor),「/ proc /%d/status」,(int)argv [1]); \t FILE * plik; \t \t plik = fopen(bufor,「r」); (「錯誤:沒有這樣的文件或目錄」);如果(錯誤:沒有這樣的文件或目錄「); \t \t exit(1); \t} \t而((與fgets(bufor2,200,plik))!= 0) \t { \t \t的printf( 「%S」,bufor); \t} \t \t \t \t FCLOSE(plik); \t } – maciekkov

+0

正如我告訴你**使用調試器** –