2017-02-19 135 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

正如我告诉你**使用调试器** –