我自己的程序在linux中作为“which”命令工作 - 不能很好地工作

时间:2015-12-04 16:27:13

标签: c linux ubuntu

我想创建自己的程序,谁将在linux中作为which命令工作。原始which命令适用于(pwd)的示例:

$ which pwd

/bin/pwd

但我的计划是这样的:

$ ./prog1 pwd

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games pwd

你能纠正我的节目吗?源代码:

#include <sys/param.h>
#include <sys/stat.h>
#include <errno.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
    char *systemPath, *path, *fileName;
    struct stat statStruct;
    if (argc < 2){
        printf( "Nothing to do\n");
    return -1;
    }
    if ((systemPath = getenv("PATH")) == NULL)
    {
        perror( "Not found PATH!\n ");
        return -1;
    }
        fileName = argv[1];
    printf("%s %s\n", systemPath, fileName);

    while ((path = strsep(&systemPath, ":")) != NULL)
    {
        if ((stat(fileName, &statStruct) == 0) && S_ISREG(statStruct.st_mode) && (statStruct.st_mode & S_IRUSR))
        {
            printf("%s\n", fileName);
            printf("%s\n", systemPath);
            printf("%s\n", path);
        }
    }
return 0;
}

1 个答案:

答案 0 :(得分:2)

您可以使用strsep找到候选目录,并将其存储在path中。但是你不要使用这个变量; stat调用只使用基本文件名,因此将始终在当前工作目录中查找。

您需要形成path/和文件名,然后是stat的串联。

您可能会发现snprintf有用。