在Linux中运行已编译的C程序时权限被拒绝

时间:2017-06-25 17:29:38

标签: c linux git permission-denied

我正在尝试编写一个简单的程序,在一个Github repo上调用git checkout -- .,这将是一个命令行参数。我想称之为> clearRepo repoName。我将所有的repos保存在同一个Github目录中。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <errno.h>

void print_error()
{
    fprintf(stderr, "Error executing: %s\n", strerror(errno));
    exit(EXIT_FAILURE);
}

void print_usage(char* this)
{
    printf("SYNTAX ERROR:\n%s [directoryName]\n", this);
    exit(EXIT_FAILURE);
}

int main(int argc, char **argv)
{ 
    if(argc != 2)
    {
        print_usage(argv[0]);
    }

    pid_t pid = fork();
    if (pid == 0)
    {   
        static char* params[] = {"git", "checkout",  "--",  ".", NULL};
        char s[50], s2[50];
        strcpy(s, "/home/myname/Documents/Github/");
        strcpy(s2, argv[1]);
        strcat(s, s2);
        printf("s: %s\n", s);
        int err = execv(s, params);
        if(err == -1)
        {
            print_error();
        }
        exit(127);
    }
    else
    {
        waitpid(pid, 0, 0);
    }

    return 0;
}

它编译得很好,但每次运行时print_error()都会吐出Error executing: Permission denied。我不太熟悉为Linux编写程序,所以这可能是一个简单的错误。我很欣赏有关我做错的信息。谢谢。

3 个答案:

答案 0 :(得分:3)

您传递给execv的第一个参数是一个目录,但execv需要一个程序。错误“Permission denied”有点误导,因为没有“执行目录的权限”这样的事情。

要更改当前目录,请致电chdir。然后,调用您想要调用的exec*函数中的任何一个git

答案 1 :(得分:-2)

chmod u + x filename用于更改文件权限。 如果要签出分支,但保存更改,请使用git stash。当你回到分支时,你可以使用git stash pop或git stash apply。

https://git-scm.com/docs/git-stash

答案 2 :(得分:-3)

Git命令和程序非常棘手。

按照以下步骤操作,您可以调试问题。

  1. 将程序中编写的git命令输入终端并检查逻辑是否真正有效。 (建议你如你所说,你刚接触Linux)
  2. 如果有效,请输入“chmod + x filename.extention”来更改文件的权限。