这几天实现ls部分功能时,用到了一些,我觉得值得细究的东西,书上没有详细讲解,那就在这记录下来。
- __LINE__用来指示本行语句在代码中所处的位置信息,如下:
#include <stdio.h>
int main()
{
printf("%d\n",__LINE__);
printf("%d\n",__LINE__);
printf("%d\n",__LINE__);
};
结果为:
还可以通过语句#line来重新设定LINE的值,举例如下:
注意:是设定#line 300的紧接着的下一行为为300.
#include <stdio.h>
#line 300 //设定下一行的__LINE__ 为300.
int main()
{
printf("%d\n",__LINE__);
printf("%d\n",__LINE__);
printf("%d\n",__LINE__);
};
结果如下:
- getpwuid与getgrgid函数
说到这两个函数就先得看两个结构体,如下:
struct passwd
{
char * pw_name; /* Username, POSIX.1 */
char * pw_passwd; /* Password */
__uid_t pw_uid; /* User ID, POSIX.1 */
__gid_t pw_gid; /* Group ID, POSIX.1 */
char * pw_gecos; /* Real Name or Comment field */
char * pw_dir; /* Home directory, POSIX.1 */
char * pw_shell; /* Shell Program, POSIX.1 */
};
struct group
{
char *gr_name; /* Group name */
char *gr_passwd; /* password */
__gid_t gr_gid; /* Group ID */
char **gr_mem; /* Member list */
};
(1)getpwuid()函数
通过用户uid查找用户的相关信息,并以passwd的结构体返回其数据.
头文件:
#include <sys/types.h>
#include <pwd.h>
函数原型:
struct passwd *getpwuid(uid_t uid);
参数 :文件所有者的uid;
返回值:成功passwd 结构体,uid所对应的用户信息,错误返回空指针。
(2)getgrgid()函数
通过gid,找到该组的相关信息,并以group结构体返回其信息。
头文件:
#include <grp.h>
#include <sys/types.h>
函数原型:
strcut group * getgrgid(gid_t gid);
参数:文件所属组的组id;
返回值:成功返回group结构体,gid对应组的相关信息。错误返回空指针。
代码示例:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<grp.h>
#include<pwd.h>
int main(int argc,char *argv[])
{
struct stat buf;
//检查参数
if(argc !=2){
┊ printf("%s <filename>\n",argv[0]);
┊ exit(0);
}
if(lstat(argv[1],&buf)==-1){
┊ perror("lstat:");
┊ exit(1);
}
struct passwd *psd; //从该结构体中获取文件所有者的用户名
struct group *grp; //从该结构体中获取文件所有者所属组的组名
psd = getpwuid(buf.st_uid);
grp = getgrgid(buf.st_gid);
printf("文件所有者的信息:\n");
printf("name: %s\n",psd->pw_name);
printf("passwd %s\n",psd->pw_passwd);
printf("uid %d\n",psd->pw_uid);
printf("gid %d\n",psd->pw_gid);
printf("gecos %s\n",psd->pw_gecos);
printf("dir %s\n",psd->pw_dir);
printf("shell %s\n",psd->pw_shell);
printf("文件所属组的信息:\n");
printf("group name %s\n",grp->gr_name);
printf("group passwd %s\n",grp->gr_passwd);
printf("组识别码 %d\n",grp->gr_gid);
printf("组成员账号 %s\n",*(grp->gr_mem));
}
en,记这些了。