子进程的文件权限

时间:2017-03-11 05:40:35

标签: c struct

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");
}
}

2 个答案:

答案 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语句

如果有帮助,请告诉我