2017-02-19 37 views
1

Добрый день. Im создает многопоточную программу, которая будет читать базовую дату о процессе, который вы укажете, используя номер 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 */ 
} 

попробовать:

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

Его рабочий :) Спасибо. Но отредактируйте улучшите свой код, просто грамм.')' и функцию конца snprintf и переименовать имя файла в statusFile внутри plik = fopen .... – maciekkov

+0

И не могли бы вы объяснить мне, почему даже когда я сделал это plik = fopen ("/ proc/argv [1]/status" ,"р"); он не работал? и в оболочке я печатал как второй параметр PID мой firefox. – maciekkov

0

Вы пытаетесь открыть файл /proc/arg/status, потому что вы используете процессор для создания пути. Вы должны поместить идентификатор процесса в пути во время выполнения, используя е, г sprintf

+1

Лучше использовать 'snprintf', потому что' sprintf' может переполнять буфер. –

+0

Tak zrobiłem dzię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; и рассчитан соответствующим образом), вам необходимо компьютер строка (например, 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; \t snprintf (bufor, sizeof (bufor) ",/proc /% d/status", (int) argv [1]); \t FILE * plik; \t \t plik = fopen (bufor, "r"); \t if (plik == 0) { \t \t perror («Ошибка: нет такого файла или каталога»); \t \t выход (1); \t} \t в то время как ((fgets (bufor2,200, Plik)) = 0!) \t { \t \t Е ("% s", bufor); \t} \t \t \t \t fclose (Plik); \t } – maciekkov

+0

Как я уже сказал, ** используйте отладчик ** –