2012-01-08 63 views
6

Tôi muốn thay đổi chủ sở hữu và nhóm tệp trong c. i google nó, nhưng nếu chỉ tìm thấy một số mã sử dụng lệnh system() và chmod hoặc các hàm tương đối. là có một cách để làm điều này mà không có chức năng system() và lệnh bash?Thay đổi chủ sở hữu và nhóm trong c

cảm ơn tất cả. nhưng vấn đề mới! : có cách nào để có được người dùng uid và gid mà không sử dụng lệnh "id -u username" trong c? phân tích cú pháp/etc/passwd? hay cách tốt hơn?

Trả lời

6

Bạn có thể sử dụng các cuộc gọi hệ thống chmod, fchmodat và/hoặc fchmod. Cả ba được đặt trong <sys/stat.h>.

Đối với quyền sở hữu, có chownfchownat, cả trong số <unistd.h>.

+0

cảm ơn bạn, nhưng một số khác! là có một cách để có được một người dùng uid và gid mà không cần sử dụng "id-tên người dùng" lệnh trong c? phân tích cú pháp/etc/passwd? hay cách tốt hơn? –

+0

Tìm kiếm getuid/geteuid/getgid/getpwent/... và xem các hàm liên quan trong tài liệu '* pwent'. Cũng 'getlogin' và' getpwnam'. – Mat

+0

oh, cảm ơn rất nhiều :) –

1

Hãy thử man 2 chownman 2 chmod.

Đồng thời xem tài liệu herehere.

+0

Có, và nói chung hơn áp phích gốc nên đọc về Posix hoặc lập trình Unix, và đọc phần giới thiệu (2) và syscalls (2) người đàn ông. –

+0

Trang hướng dẫn sử dụng chown (ít nhất là của tôi) không cho bạn biết cách chuyển tên người dùng và nhóm thành số nguyên ID. – Pulseczar

1

chown() thực hiện thủ thuật.

man 2 chown 
1

Có một chức năng chown trong hầu hết các thư viện C:

#include <sys/types.h> 
#include <unistd.h> 

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

Để hoàn thành câu trả lời, trên Linux sau đây có thể được sử dụng (tôi đã thử nghiệm trên Ubuntu):

#include <sys/types.h> 
#include <pwd.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"); 
    } 
} 
Các vấn đề liên quan