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 0
int
main (int argc, char *argv[])
{
uid_t uid ;
struct passwd *pwdp ;
int i, j ;
char *endptr ;
char bSuccess ;
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[1], &endptr, 0) ;
if (*endptr != '\0') { // user name
if ((pwdp = getpwnam (argv[1])) == 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[2], _PC_CHOWN_RESTRICTED)) ;
if (chown (argv[2], pwdp->pw_uid, -1) == -1)
err_ret ("chown for uid error ") ;
else
printf ("success to change uid") ;
putchar ('\n') ;
if (chown (argv[2], -1, pwdp->pw_gid) == -1)
err_ret ("chown for gid error ") ;
else
printf ("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,不能改变文件所属者,但可以将自己的文件改变为自己……(听起来很那个= =!)
分享到:
相关推荐
英文原版的第三版Unix 环境高级编程,圣经不多说,值得看原版。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
APUE-Edition2-英文版 有检索目录 图灵经典书籍 APUE-Edition2-英文版 有检索目录 图灵经典书籍
非常适合学习ARM开发的人员,能够精确的学习快速提高apue知识
书本APUE后面的附录清单中的代码,用于使书本的例程中的err_sys等函数可以被使用。具体使用方法可以参见:blog.csdn.net/fanfank 中的《APUE代码注记》这篇博客,如果你还没见到这篇博客……证明我还没写好……
APUE学习笔记.xmind
使用CMake的APUE 该存储库包含《 Unix环境中的...cd apue-cmake mkdir build cd build cmake .. make 注意:在每一章的子目录中,您都可以看到README.md,其中列出了代码示例名称,以帮助您查找哪个代码是哪个示例。
详细介绍了unix环境的基本操作,是学习apue的基础
apue
APUE- UNIX环境高级编程
《unix高级编程》一书中的实例程序会用到apue.h文件,因为不是库文件所以调用的时候会出错,本文综合网络上的资料,提供解决办法
apue -- advance programming in unix environment <br>高级unix环境编程 第二版
UNIX环境高级编程第三版源码,Linux编程经典。。。。。。
APUE读书笔记: 可以学习一下简化的APUE了,自己可以边看边学,很不错的笔记
相信很多初学《UNIX环境高级编程》的朋友都会遇到一个问题,运行里面的实例时就出现问题,提示 "错误:apue.h:没有那个文件或目录". apue.h是作者自定义的一个头文件,包括程序所需的常用头文件及出错处理函数。...
本章开始讨论UNIX系统,先说明可用的文件I/O函数——打开文件、读文件、写文件等等。 大多数UNIX文件I/O只需用到5个函数: open ...本章所说明的函数经常被称之为不带缓存的I/O(与标准I/O 函数相对照
APUE3+代码+APUE2(中文).经典中的经典。我就不做过多介绍了
apue代码包
apue的中文版,内容清晰,LINUX编程不可不看的好书!
Apue unix高级编程的源码
UNIX环境高级编程(APUE)V3 UNIX环境高级编程(APUE)V3 UNIX环境高级编程(APUE)V3