我无法在argv[i](或/bin)中找到/sbin,程序包仅检查其运行目录。如何在argv[i]/bin中检查/sbin

我目前正在使用自己的程序包管理器,正在用纯C语言编写它。我目前正在编写检查以查看是否已安装通过(使用argv[]的)程序包。我遇到的问题是,当我运行检查时,我的代码仅检查它从中运行的目录,并且我需要它检查/bin/sbin(我将处理/sbin的检查)并且我正在尝试让它检查/bin,但是运气为零。每次他们仅检查当前工作目录时,我似乎都无法正常工作,我需要他们检查/bin。我无法弄清楚,以前有人偶然在纯C语言中完成此操作吗?谢谢

到目前为止,这些都是我尝试过的所有方法,但是它们都不起作用...

使用stat()

#include <stdio.h>
#include <sys/stat.h>

#include <stdlib.h>
#include <dirent.h>

int main(int argc, char *argv[])
{
        struct dirent *de = calloc(1, sizeof(struct dirent));
        DIR *dr = opendir("/bin"); /* directory to open */

        short i;
        struct stat *program = calloc(1, sizeof(struct stat));

        if (dr == NULL) {
                printf("directory could not be opened");
                return 0;
        }

        while ((de = readdir(dr)) != NULL) {
                for (i = 1; i < argc; i++) {

                        if (stat(argv[i], program) == 0) {
                                printf("found\n");
                                closedir(dr);
                        }

                        else {
                                printf("not found\n");
                                closedir(dr);
                        }
                }
        }
}


使用realpath

#include <stdio.h>
#include <stdlib.h>

#include <dirent.h>

int main(int argc, char *argv[])
{
        struct dirent *de = calloc(1, sizeof(struct dirent));
        DIR *dr = opendir("/bin"); /* directory to open */

        short i;
        char *res = realpath(argv[i], NULL);

        if (dr == NULL) {
                printf("directory could not be opened");
                return 0;
        }

        while ((de = readdir(dr)) != NULL) {
                for (i = 1; i < argc; i++) {

                        if (res == NULL) {
                                printf("found\n");
                                closedir(dr);
                        }

                        else {
                                printf("not found\n");
                                closedir(dr);
                        }
                }
        }
}


使用strcmp

#include <stdio.h>
#include <string.h>

#include <dirent.h>

int main(int argc, char *argv[])
{
        struct dirent *de;
        DIR *dr = opendir("/bin"); /* directory to open */

        short i;
        struct stat program;

        if (dr == NULL) {
                printf("directory could not be opened");
                return 0;
        }

        while ((de = readdir(dr)) != NULL) {
                for (i = 1; i < argc; i++) {

                        if (strcmp(de->d_name, argv[i]) == 0) {
                                printf("found\n");
                                closedir(dr);
                        }

                        else {
                                printf("not found\n");
                                closedir(dr);
                        }
                }
        }
}


我希望他们都可以如下工作:

check echo

// it would go to /bin and find echo and then print
found


但是当我运行它们时,它们仅检查当前的工作目录,因此例如:

check connection.c

// finds connection.c in the same directory
found




那霸!我找到了一种方法!因此,使用功能chdir()可以在stat()中运行/bin,如下所示:

#include <stdio.h>
#include <sys/stat.h>

#include <stdlib.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
        short i;
        struct stat *program = calloc(1, sizeof(struct stat));

        for (i = 1; i < argc; i++) {
                chdir("/bin"); /* move to /bin */

                if (chdir("/bin") != 0)
                        return 1;

                if (stat(argv[i], program) == 0)
                        return 0;


                else
                        return 1;
                }
}

最佳答案

我试图简化您的代码只是为了输出文件夹的内容,每次都得到“ / bin”文件夹的内容。

作为一般经验法则,我希望在没有警告的情况下编译我的代码,对其进行测试以达到预期的效果,然后再进行下一步工作。

“结构统计程序”导致代码无法编译,我猜是您正在运行旧版本的代码。

#include <stdio.h>
#include <dirent.h>
#include <string.h>

int main(int argc, char *argv[])
{
        struct dirent *de;
        DIR *dr = opendir("/bin"); /* directory to open */

        short i;
    //        struct stat program;

        if (dr == NULL) {
                printf("directory could not be opened");
                return 0;
        }

        while ((de = readdir(dr)) != NULL) {
      printf(de->d_name);
      printf("\n");
        }
}

08-16 19:40