Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LinuxC编程中的文件路径_C_Linux_Path - Fatal编程技术网

LinuxC编程中的文件路径

LinuxC编程中的文件路径,c,linux,path,C,Linux,Path,你好。 我正在创建一个多线程程序,该程序将读取有关进程的基本日期,您将使用PID编号指向该进程。 其中一个线程应该从“状态”文件中读取信息。此文件处于/proc/NUMBER\u PID/status 所以我编写了这个pthread函数。但我还是犯了一个错误。有人能指出问题出在哪里吗 pthread_create(&pth[1],NULL,odczyt,&pid); ..... ##define NUMBER arg void *odczyt(void*arg) { ch

你好。 我正在创建一个多线程程序,该程序将读取有关进程的基本日期,您将使用PID编号指向该进程。 其中一个线程应该从“
状态
”文件中读取信息。此文件处于
/proc/NUMBER\u 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);
}

您正试图打开文件
/proc/arg/status
,因为您使用处理器创建路径。您应该在运行时使用e,g将pid放入path,您的代码中有很多问题

##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 */
}
尝试:

这行是错的(仔细阅读…)

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

(上述
fopen
不太可能出现故障,但如果文件描述符不足,则可能会发生故障)

或者,如果您关心给定的
pid
(声明为
pid\t pid;
并进行了适当计算)的其他进程,则需要计算一个字符串(例如,下面代码块中的
pathname
),其中包含适当的路径(shell将从
/proc/$pid/status
展开的内容;请阅读):

使用所有警告和调试信息编译代码(例如,
gcc-Wall-Wextra-g
),然后使用调试器(
gdb


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

你得到的错误是什么?你的错误到底是什么?@maciekkov你试过没有线程的版本吗?如何将/proc/NUMBER设置为pid?数字不会按您的方式扩展到pid中。@maciekkov您需要提供一个我们可以编译的程序Enumber在编译时被替换。要将数字放入字符串中,请使用strncat。它可以工作:)谢谢。但是编辑和改进你的代码,仅仅是一个gramar以及结束snprintf函数并将文件名重命名为plik=fopen内的statusFile…。您能解释一下为什么即使我制作了这个plik=fopen(“/proc/argv[1]/status”,“r”);它不起作用了?在shell中,我像在firefox中输入第二个参数一样输入。最好使用
snprintf
,因为
sprintf
可能会导致缓冲区溢出。Tak zrobiłem dzięki:)实际上我修改了你的代码,有些地方出了问题,你能看看吗#include#include int main(int argc,char*argv){char bufor[100];charbufor2;snprintf(bufor,sizeof(bufor),“/proc/%d/status”;(int)argv[1]);FILE*plik;plik=fopen(bufor,“r”);if(plik==0){peror(“错误:没有这样的文件或目录”);退出(1)}而((fgets(fgets(bufor2200,plik))!=0){printf(%s),bufor);}fclose(plik)正如我告诉过你的,使用调试器
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);
}
plik=fopen("/proc/NUMBER/status","r");
plik = fopen("/proc/self/status", "r");
if (!plik) {perror("/proc/self/status"); exit(EXIT_FAILURE); }
char pathname[80];
snprintf(pathname, sizeof(pathname), "/proc/%d/status", (int)pid);
plik = fopen(pathname, "r");
if (!plik) {perror(pathname); exit(EXIT_FAILURE); }