在C语言中如何更改文件的所有者和组?

14

我想在C语言中更改文件的所有者和组。我搜索了一下,但只找到了使用system()chmod命令或相关函数的代码。

是否有一种方法可以不使用system()函数和Bash命令来实现这一点?


GNU 核心工具 (coreutils) 包应该包含 chown 的源代码。 - jww
5个回答

13
为了完整回答问题,在Linux上可以使用以下命令(我已经在Ubuntu上测试过):

要完成答案,可以在Linux上使用以下命令(我已在Ubuntu上进行了测试):

#include <sys/types.h>
#include <pwd.h>
#include <grp.h>

void do_chown (const char *file_path,
               const char *user_name,
               const char *group_name) 
{
  uid_t          uid;
  gid_t          gid;
  struct passwd *pwd;
  struct group  *grp;

  pwd = getpwnam(user_name);
  if (pwd == NULL) {
      die("Failed to get uid");
  }
  uid = pwd->pw_uid;

  grp = getgrnam(group_name);
  if (grp == NULL) {
      die("Failed to get gid");
  }
  gid = grp->gr_gid;

  if (chown(file_path, uid, gid) == -1) {
      die("chown fail");
  }
}

10
您可以使用 chmodfchmodat 和/或fchmod 系统调用。这三个函数都在 <sys/stat.h> 头文件中。
对于所有权,有 chownfchownat,两者都在 <unistd.h> 中。

搜索 getuid/geteuid/getgid/getpwent/... 并查看 *pwent 文档中的相关函数。还有 getlogingetpwnam - Mat

1

尝试使用man 2 chownman 2 chmod

还可以查看此处此处的文档。


是的,更一般地说,原帖作者应该阅读有关Posix或Unix编程的内容,并阅读intro(2)和syscalls(2)手册页。 - Basile Starynkevitch
1
chown的man页面(至少是我的)没有告诉你如何将用户和组名转换为整数ID。 - Pulseczar

1

chown() 就能搞定。

man 2 chown

1
大多数C库中都有一个chown函数:
#include <sys/types.h>
#include <unistd.h>

int chown(const char *path, uid_t owner, gid_t group);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接