美好的一天。
我正在创建一个多线程程序,它将读取有关过程的基本日期,您将使用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);
}
答案 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
答案 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
)