UNIX高级环境编程学习(三)----------------基础知识

来源:互联网 发布:游戏帧数限制软件 编辑:程序博客网 时间:2024/05/16 14:38
进程控制

1.进程控制的三个主要函数

fork:

exec:(exec函数有7种变体,统称为exec函数)

waitpid:

例如:


#include “apue.h”

#include <sys/wait.h>

int main(void)

{

char buf[MAXLINE];

pid_t pid;

int status;


printf("%% ");

while(fgets(buf, MAXLINE, stdin) != NULL)

{

if(buf[stren(buf) - ] == '\n')

buf[strlen(buf) - ] = 0;

if((pid = fork() <0)

{

err_sys("fork error");

}else if(pid  == 0)

{

execlp(buf,buf,( char *)0);

err_ret("couldn't execute : %s",buf);

exit(127);

}


if ((pid == waitpid(pid,&status,0)) < 0)

err_sys("waitpid error");

printf("%% ");

}

exit(0);

}


这个程序可执行简单的shell命令,但是不允许带参,例如 ls -a是不行的,只能执行ls或者data等指令

线程:

一个进程有一个控制线程--某一时刻执行的一组机器指令(进程读取指令,控制线程执行?)

一个进程内的所有线程共享同一地址空间,文件描述符,栈以及进程相关属性,因为他们能访问同一存储区,所以访问数据时,线程间需要同步。

线程有线程ID,但只在所属进程有效。

出错处理:

unix系统出错时,通常会返回一个负值,整形变量error通常被设置为具有特定信息的值,

在多线程环境中,每个线程都有一个局部的error来避免相互干扰。

error的两条规则:

1.若果没有出错,error的值不会被例程清除,所以在函数返回出错时才去检验它的值。

2.任何函数都不会将error的值设置为0,而且<error.h>重定义的所有常量都不为0;

c标准定义了两个函数来打印出错信息:

char * strerror(int errnum);

char * perror(const char *msg);


例:

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
int main(void)
{
    FILE *fp;
    fp=fopen("/root/noexitfile","r+");
    if(NULL==fp)
    {
        perror("/root/noexitfile");
    }
    return 0;
}

运行结果

1
2
3
[root@localhost io]# gcc perror.c
[root@localhost io]# ./a.out
/root/noexitfile: No such file or directory

用户标识

1.用户ID

口令文件登录项中的用户ID是一个数值,它向系统标识各个不同的用户系统管理员在确定一个用户的登录名的同时,确定其用户ID。用户不能改变其用户ID。通常用户ID唯一。

内核是怎么检验用户是否具有权限来执行某些操作?

用户ID为0的用户为根用户root或者超级用户superuser。在口令文件中通常有一个登录项,登录名为root,我们称这种用户的特权为超级用户特权。如果一个进程具有超级用户特权,则大多数文件权限检查都不在进行。某些操作系统功能只向超级用户提供,超级用户对系统有自由的支配权。

2.组ID

口令文件登录项也包括用户的组ID,它是一个数值。组ID也是有系统管理员指定用户登录名时分配的。一般来说,在口令文件中有多个登录项具有相同的组ID。组被用于将若干用户集合到项目或部门中去。这种机制允许同组的各个成员之间共享资源(如文件),通过设置文件的权限使组内所有成员都能访问该文件,而组外用户不能访问。

组文件将组名映射为数值的组ID。组文件通常为/etc/group。

使用数值的用户ID和数值的的组ID设置权限。磁盘上的每个文件,文件系统都存储该文件所有者的用户ID和组ID。 存储这两个值只需要4个字节(假设每个都以双字节的整型值存储)。如果使用完整的ASCLL登录名和组名,则需要更大的空间。另外,检验权限期间,比较字符串比整整更费时间。

但对于用户使用名字比使用数值方便,所以口令文件包含了登录名和用户ID之间的映射关系,而组文件则包含了组名和组ID之间的映射关系。例如,ls -l命令使用口令文件将数值的用户ID映射为登录名,从而打印出文件所有者的登录名。

unix系统使用32位整形数表示用户ID和组ID。

例:

getuid();获取用户ID

getgid();获取组ID

附属组ID

除了口令文件中对一个登录名指定一个组ID外,大多数的UNIX系统版本还允许一个用户属于另外一个组,从4.2BSD开始,它允许一个用户属于多至16个其他的组。登录时,读文件/etc/group/,寻找列有该用户作为其成员的前16个纪录项就可以得到该用户的附属组ID。POSIX要求系统至少应支持8个附属组,实际上大多数系统至少支持16个附属组。



0 0
原创粉丝点击