使用 stat (st_uid) 的分段错误(核心已转储)
Segmentation fault (core dumped) using stat (st_uid)
我想在 UNIX 中编写一个像 "ls -l" 一样工作的简单 C 脚本。我有一个工作部分,其中脚本列出了当前目录中的所有文件:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
DIR *katalog;
struct dirent *dir;
katalog = opendir(".");
if (argc == 1) {
printf("without option");
if (katalog) {
while ((dir = readdir(katalog)) {
printf("%s \n", dir->d_name);
}
closedir(katalog);
}
return(0);
}
}
现在我想添加有关 st_gid、st_uid、st_size 和 st_mtime 的信息。我从 st_uid 开始凝视。我的代码现在看起来像那样(它在 unix 下编译得很好)。不幸的是,它给了我一个错误 "Segmentation fault (core dumped)"。我试图在 Stack 和 Internet 中寻找答案,我什至使用了其他线程的一些提示(例如:C format issue with printf("%d", astatbuff->st_size);),但仍然出现错误......我不知道我还能做什么更改以修复它...
这是产生错误的代码:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
DIR *katalog;
struct dirent *dir;
katalog = opendir(".");
struct stat *astat;
if (argc == 1) {
printf("Without option");
if (katalog) {
while ((dir = readdir(katalog)) != NULL && astat->st_uid != 0) {
printf("%s %llu \n", dir->d_name, (unsigned long long)astat->st_uid);
}
closedir(katalog);
}
return(0);
}
}
astat
未在您的代码中初始化(在您的 while 循环中使用)
由于 astat
在 astat->st_uid
之前尚未 initialize/assign,代码显示 未定义的行为 (UB)。在 OP 案例中,代码崩溃了,
不是声明一个没有值的指针,而是代码指向:
1) 声明一个 struct stat
对象。
2) 用 *stat()
调用填充它。 ref.
int main(int argc, char *argv[]) {
DIR *katalog;
struct dirent *dir;
katalog = opendir(".");
//struct stat *astat;
if (argc == 1) {
printf("Without option");
if (katalog) {
while ((dir = readdir(katalog)) != NULL) {
// add
struct stat sb;
if (lstat(dir->d_name, &sb) == -1) {
perror("lstat");
exit(EXIT_FAILURE);
}
if (sb.st_uid != 0) {
printf("%s %llu \n", dir->d_name, (unsigned long long) sb.st_uid);
}
}
closedir(katalog);
}
}
return (0);
}
我想在 UNIX 中编写一个像 "ls -l" 一样工作的简单 C 脚本。我有一个工作部分,其中脚本列出了当前目录中的所有文件:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
DIR *katalog;
struct dirent *dir;
katalog = opendir(".");
if (argc == 1) {
printf("without option");
if (katalog) {
while ((dir = readdir(katalog)) {
printf("%s \n", dir->d_name);
}
closedir(katalog);
}
return(0);
}
}
现在我想添加有关 st_gid、st_uid、st_size 和 st_mtime 的信息。我从 st_uid 开始凝视。我的代码现在看起来像那样(它在 unix 下编译得很好)。不幸的是,它给了我一个错误 "Segmentation fault (core dumped)"。我试图在 Stack 和 Internet 中寻找答案,我什至使用了其他线程的一些提示(例如:C format issue with printf("%d", astatbuff->st_size);),但仍然出现错误......我不知道我还能做什么更改以修复它...
这是产生错误的代码:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
DIR *katalog;
struct dirent *dir;
katalog = opendir(".");
struct stat *astat;
if (argc == 1) {
printf("Without option");
if (katalog) {
while ((dir = readdir(katalog)) != NULL && astat->st_uid != 0) {
printf("%s %llu \n", dir->d_name, (unsigned long long)astat->st_uid);
}
closedir(katalog);
}
return(0);
}
}
astat
未在您的代码中初始化(在您的 while 循环中使用)
由于 astat
在 astat->st_uid
之前尚未 initialize/assign,代码显示 未定义的行为 (UB)。在 OP 案例中,代码崩溃了,
不是声明一个没有值的指针,而是代码指向:
1) 声明一个 struct stat
对象。
2) 用 *stat()
调用填充它。 ref.
int main(int argc, char *argv[]) {
DIR *katalog;
struct dirent *dir;
katalog = opendir(".");
//struct stat *astat;
if (argc == 1) {
printf("Without option");
if (katalog) {
while ((dir = readdir(katalog)) != NULL) {
// add
struct stat sb;
if (lstat(dir->d_name, &sb) == -1) {
perror("lstat");
exit(EXIT_FAILURE);
}
if (sb.st_uid != 0) {
printf("%s %llu \n", dir->d_name, (unsigned long long) sb.st_uid);
}
}
closedir(katalog);
}
}
return (0);
}