C编程问题
我试图让父进程为每个进程打印一个子进程 文件作为参数传递,或者如果没有传递参数,则获取当前目录中的每个文件。对于所有文件的打印权限。我相信问题是我的struct stat buf的位置; (目前是全球性的)。目前我的输出打印出文件名和目录,但不打印权限。任何建议将不胜感激
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pwd.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <dirent.h>
void permission();
typedef int bool;
#define TRUE 1
#define FALSE 0
struct stat buf;
int main(int argc, char *argv[]) {
bool commandline = FALSE; //determine if 0 args passed
if (argc < 2){commandline=TRUE;}
struct passwd *passwd;
passwd = getpwuid(getuid());
char *file, *dir;
uid_t uid; //user id
gid_t gid; //group
uid = getuid();
gid = getgid();
DIR *d;
struct dirent *directory;
d = opendir(".");
struct stat buf;
int i,pid=1;
for (i = 1; (i < argc && pid) || (commandline==TRUE) ; i++) {
if (!(pid = fork())) {
if (argc > 1) {
dir = passwd->pw_dir;
file = malloc(sizeof(dir) + 1 + sizeof(argv[i]));
strcat(file, dir);
strcat(file, "/");
strcat(file, argv[i]);
printf("File: %s\nDirectory: %s\n", argv[i], file);
permission();
} else {
if (d) {
while ((directory = readdir(d)) != NULL) {
dir = passwd->pw_dir;
printf("File: %s\n",directory->d_name);
printf("Directory: %s/%s\n",dir, directory->d_name);
permission();
}
}
}
} /* IF CHILD */
commandline=FALSE;
} /* FOR LOOP */
while (wait(NULL) > 0);
} /* !Main */
/* PRINT FILE PERMISSIONS*/
void permission() {
int fileMode;
fileMode = buf.st_mode;
if (fileMode & S_IRUSR) {
printf("You have Owner permissions:");
if (fileMode & S_IREAD) { printf(" Read "); }
if (fileMode & S_IWRITE) { printf("Write "); }
if (fileMode & S_IEXEC) { printf("Execute"); }
printf("\n\n");
} else if (fileMode & S_IRGRP) {
printf("You have Group permissions:\n");
if (fileMode & S_IREAD) { printf(" Read "); }
if (fileMode & S_IWRITE) { printf("Write "); }
if (fileMode & S_IEXEC) { printf("Execute"); }
printf("\n\n");
} else if (fileMode & S_IROTH) {
printf("You have General permissions:");
if (fileMode & S_IREAD) { printf(" Read "); }
if (fileMode & S_IWRITE) { printf("Write "); }
if (fileMode & S_IEXEC) { printf("Execute"); }
printf("\n\n");
}
}
答案 0 :(得分:0)
实际上,struct stat buf
出现在文件范围内,并作为main
的局部变量出现。
问题很简单:你从不打电话给 stat (2)。当您调用permission
时,您正在传递未初始化的缓冲区。显然,它都是零,并且您的if
语句都没有评估为真。
每个子进程都有自己的地址空间。无论buf
是本地定义还是全局定义,它都会出现在子地址空间中,因为它是其父项的副本。
答案 1 :(得分:0)
就像James Lowden所说,你的struct stat buf
是一个主要的局部变量,目前无法在你的函数permission()
中使用。
然后,你必须传递一个&#34;非null&#34;缓冲区,例如,由0&#39;初始化,然后程序将能够输入您的if
语句
如果有帮助,请告诉我