panyanyany 发表于 2013-1-31 10:44:59

apue 学习之 Chapter 4

 
4.11. chown,fchown, and lchown Functions

在做实验之前,因为操作vim和bash环境设置的问题搞了好长时间,总算勉勉强强顺手了。不过vim操作和bash脚本编程,.vimrc和.bashrc编写确实要抽时间来熟悉一下。
 
本例的初衷是为了理解上面那几个函数,不过我想功能应该是差不多的,于是就只选取了chown来做实验。
实验代码如下:
 
#include <stdio.h>#include <unistd.h>#include "apue.h"#include "myerr.c"#include <pwd.h>#ifdef _POSIX_CHOWN_RESTRICTED#undef _POSIX_CHOWN_RESTRICTED#endif#define _POSIX_CHOWN_RESTRICTED 0intmain (int argc, char *argv[]){uid_tuid ;struct passwd*pwdp ;    int   i, j ;    char    *endptr ;charbSuccess ;    if (argc != 3)      err_quit ("usage : a.out <attribute> <filename> ...\n") ;    printf ("current user id :\t\t %d\n", getuid ()) ;    printf ("current group id :\t\t %d\n", getgid ()) ;    printf ("current effective user id :\t %d\n", geteuid ()) ;    printf ("current effective ground id :\t %d\n", getegid ()) ;    uid = strtol (argv, &endptr, 0) ;    if (*endptr != '\0') {// user name      if ((pwdp = getpwnam (argv)) == NULL)            err_msg ("getpwnam error : ") ;    } else {      if ((pwdp = getpwuid (uid)) == NULL)            err_msg ("getpwuid error : ") ;    }puts ("\nuser/group info by getpwnam/getpwuid function:") ;    printf ("user : %s\n", pwdp->pw_name) ;    printf ("pwd: %s\n", pwdp->pw_passwd) ;    printf ("uid: %d\n", pwdp->pw_uid) ;    printf ("gid: %d\n", pwdp->pw_gid) ;    printf ("uifo : %s\n", pwdp->pw_gecos) ;printf ("home : %s\n", pwdp->pw_dir) ;printf ("shell: %s\n", pwdp->pw_shell) ;    printf ("-------\n") ;printf ("_POSIX_CHOWN_RESTRICTED : %ld\n", pathconf (argv, _PC_CHOWN_RESTRICTED)) ;    if (chown (argv, pwdp->pw_uid, -1) == -1)         err_ret ("chown for uiderror ") ;elseprintf ("success to change uid") ;putchar ('\n') ;    if (chown (argv, -1, pwdp->pw_gid) == -1)      err_ret ("chown for giderror ") ;elseprintf ("success to change gid") ;putchar ('\n') ;    exit (0) ;}  
此代码类似于bash的chown命令。从控制台接收三个参数,第一个是程序名,第二个是新的用户名或群组名,第三个是文件名。
第一部分,先输出当前用户的信息(uid,gid,euid,egid);
第二部分,输出新的用户名或群组名的信息,与/etc/passwd保持一致;
第三部分,输出_POSIX_CHOWN_RESTRICTED的值,看系统是否对chown的功能进行了限制;
第四部分,输出是否能改变文件的uid和gid。
 
实验结果表明,Fedora中对chown的功能是有限制的_POSIX_CHOWN_RESTRICTED被定义为1.
对于非特权用户,只能改变自己文件的所属group,不能改变文件所属者,但可以将自己的文件改变为自己……(听起来很那个= =!)
页: [1]
查看完整版本: apue 学习之 Chapter 4