关于pwd.c文件的SIGSEGV分段错误


#include <unistd.h>
#include <pwd.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

uid_t userIdFromName(char *name)
{
struct passwd* pwd;

pwd=getpwnam(name);
if(pwd==NULL)
{
perror("gepwnamn");
exit(EXIT_FAILURE);
}
return pwd->pw_uid;
}
int main(int argc, char* argv[])
{
uid_t uid;
int totalEntries=0;
DIR* dir;
struct dirent* newFile;
char strUID[65];
if(argc<1)
{
fprintf(stderr,"The format is: %s name",argv[0]);
exit(EXIT_FAILURE);
}
uid=userIdFromName(argv[1]);
dir=opendir("/proc/");
sprintf(strUID,"%d",uid);

while((readdir(dir))!=NULL)
{
totalEntries++;
}

char* dirNames[1000];
char* dirIds[1000];
int newCount=0;
dir=opendir("/proc/");

while((newFile=readdir(dir))!=NULL)
{

char statusFilePath[65]="/proc/";
strcat(statusFilePath,newFile->d_name);
strcat(statusFilePath,"/status");
FILE* statusFile=fopen(statusFilePath,"r");//one of the file has been opened;
size_t size;
char* lineData;

if(statusFile==NULL)
continue;

int currentPoisition=0;
while((getline(&lineData,&size,statusFile))!=-1)
{


if(strncmp("Uid:",lineData,strlen("Uid:"))==0)
{   

char* dataLine;
currentPoisition=ftell(statusFile);
fseek(statusFile,0,SEEK_SET);

if(strstr(lineData,strUID)!=NULL)
{


int forName=0,forPid=0;
while((getline(&dataLine,&size,statusFile))!=-1)
{


if(strncmp("Name:",dataLine,strlen("Name:"))==0)
{
printf("%sn",dataLine);
dirNames[newCount]=dataLine;
forName=1;

}
if(strncmp("Pid:",dataLine,strlen("Pid:"))==0)
{
printf("%sn",dataLine);
dirIds[newCount]=dataLine;
forPid=1;
}
if(forName==1&&forPid==1)
{
newCount++;
}

}
}
fseek(statusFile,0,SEEK_SET);
fseek(statusFile,currentPoisition,SEEK_SET);
}
}

}

/* int runner=0;
while(runner<newCount)
printf("%sn",dirNames[runner++]);*/
}

我一直无法理解为这个程序生成的核心转储。程序中途崩溃。以下是核心转储信息:

程序终止,信号为SIGSEGV,分段故障。#在nss_files/files pwd.c:32处的_nss_files_getpwnam_r中的0 0x00007f4ed8699d9c(名称=0x0,结果=0x7f4ed8896140,缓冲区=0x559f75c7e2a0"根",buflen=1024,errnop=0x7f4ed889a4c0(32 nss_files/files-pwd.c:没有这样的文件或目录。

我感谢你的帮助。

在这里使用argv[1]之前,您是否对其内容进行了限定?

uid=userIdFromName(argv[1]);

此外,在其他问题中,使用创建为的变量

char* lineData;

在诸如之类的函数中

while((getline(&lineData,&size,statusFile))!=-1)

可能会导致seg-fault,因为您正试图向您不拥有的位置写入。

相同:

char *dataLine;
...
while((getline(&dataLine,&size,statusFile))!=-1)  

等等。

在使用之前为这些(以及任何其他类似的(创建内存和地址。

例如:

size_t size = 1000;
char *lineData  = malloc(size*(sizeof(*lineData));
if(lineDate)
{
//continue to use lineData 
free(lineData);//when done using it 
... 

最新更新