LINUX C编程中的文件路径

时间:2017-02-19 16:20:11

标签: c linux path

美好的一天。 我正在创建一个多线程程序,它将读取有关过程的基本日期,您将使用PID号指向该过程。 其中一个线程应该从“status”文件中读取信息。此文件位于/proc/NUMBER_PID/status
所以我写了这个pthread函数。但我仍然犯了一个错误。任何人都可以指出问题在哪里?

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);
}

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

您正在尝试打开文件/proc/arg/status,因为您使用处理器来创建路径。你应该使用e,g sprintf

在运行时将pid放在路径中

答案 2 :(得分:0)

这一行是错误的(仔细阅读 proc(5) ...)

this.state.date

您可能想要(如果您关心自己的流程):

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;)包含适当的路径( shell 将从pathname扩展的内容;阅读globbing):

/proc/$pid/status

使用所有警告编译代码&调试信息(例如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

(你真的需要知道如何使用调试器,所以花几个小时或几天来学习how to use gdb