c程序的分段错误
Segmentation fault for c program
这里的代码出现分段错误。
gdb :
Program received signal SIGSEGV, Segmentation fault.
_IO_fgets (buf=0x601080 <rc> "", n=100, fp=0x0) at iofgets.c:50
50 iofgets.c: No such file or directory.
代码:
#include <unistd.h>
#include <stdio.h>
char rc[100];
FILE *fp;
int status;
void main() {
fp = popen("sudo lshw |", "grep UUID");
if (fp == NULL)
printf("NULL pointer");
while (fgets(rc, 100, fp) != '[=11=]')
printf("%s", rc);
status = pclose(fp);
if (status == -1) {
printf("pclose error");
/* Error reported by pclose() */
} else{
printf("Unknown error");
}
//return 0;
}
我猜是空指针?我尝试了给出的解决方案,但没有奏效。我猜是个愚蠢的错误
抱歉,shell 命令将 sudo dmidecode | grep UUID
这是错误的
fp = popen("sudo lshw |", "grep UUID");
也许你的意思是,阅读 popen()
fp = popen("sudo lshw | grep UUID", "r");
调用失败,但即使您检查了 fp == NULL
,您仍然继续导致未定义的行为,并导致分段错误,fp == NULL
检查需要中止程序,如下所示
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
char rc[100];
FILE *fp;
int status;
fp = popen("sudo lshw | grep UUID", "r");
if (fp == NULL)
{
printf("error:%d: %s", errno, strerror(errno));
return -1;
}
while (fgets(rc, 100, fp) != NULL)
printf("%s", rc);
status = pclose(fp);
if (status == -1) {
printf("error:%d: %s", errno, strerror(errno));
} else { /* this means no error happened */
printf("success: pipe, closed.");
}
return 0;
}
请注意 main()
应 return 为 int
,正如 Joachim Pileborg 评论的那样,fgets(...) == '[=18=]'
是错误的,fgets()
returns NULL
出错并且 NULL == '[=21=]'
不一定正确。
此外,pclose()
returns -1
出错,如果没有 return -1
那么一切都按预期进行。
这里的代码出现分段错误。
gdb :
Program received signal SIGSEGV, Segmentation fault.
_IO_fgets (buf=0x601080 <rc> "", n=100, fp=0x0) at iofgets.c:50
50 iofgets.c: No such file or directory.
代码:
#include <unistd.h>
#include <stdio.h>
char rc[100];
FILE *fp;
int status;
void main() {
fp = popen("sudo lshw |", "grep UUID");
if (fp == NULL)
printf("NULL pointer");
while (fgets(rc, 100, fp) != '[=11=]')
printf("%s", rc);
status = pclose(fp);
if (status == -1) {
printf("pclose error");
/* Error reported by pclose() */
} else{
printf("Unknown error");
}
//return 0;
}
我猜是空指针?我尝试了给出的解决方案,但没有奏效。我猜是个愚蠢的错误
抱歉,shell 命令将 sudo dmidecode | grep UUID
这是错误的
fp = popen("sudo lshw |", "grep UUID");
也许你的意思是,阅读 popen()
fp = popen("sudo lshw | grep UUID", "r");
调用失败,但即使您检查了 fp == NULL
,您仍然继续导致未定义的行为,并导致分段错误,fp == NULL
检查需要中止程序,如下所示
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main() {
char rc[100];
FILE *fp;
int status;
fp = popen("sudo lshw | grep UUID", "r");
if (fp == NULL)
{
printf("error:%d: %s", errno, strerror(errno));
return -1;
}
while (fgets(rc, 100, fp) != NULL)
printf("%s", rc);
status = pclose(fp);
if (status == -1) {
printf("error:%d: %s", errno, strerror(errno));
} else { /* this means no error happened */
printf("success: pipe, closed.");
}
return 0;
}
请注意 main()
应 return 为 int
,正如 Joachim Pileborg 评论的那样,fgets(...) == '[=18=]'
是错误的,fgets()
returns NULL
出错并且 NULL == '[=21=]'
不一定正确。
此外,pclose()
returns -1
出错,如果没有 return -1
那么一切都按预期进行。