摘要: 特权(如能改变当前日期的表示法以及访问控制)是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己的用户ID或组ID,使得新ID具有合适的特权或访问权限。当程序需要降低其特权或阻止对某些资源的访问时,也需要更换用户ID或组ID,从而使新ID不具有相应特权或访问这些资源的能力。一般来说我们总是试图使用最小特权(least privilege)。1 #include <unistd.h>2 3 //设置实际和有效用户ID和组ID,若成功则返回0,出错则返回-14 int setuid(uid_t uid);5 6 int setgid(gid_t 阅读全文
posted @ 2012-07-04 17:11 Cavia 阅读(2288) 评论(0) 推荐(0) 编辑
摘要: 当进程调用exec函数时,该进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行,因为调用exec并不创建新进程,所以前后的进程ID并未改变。exec只是用一个全新的程序替换了当前进程的代码段、数据段、堆和栈。 1 #include <unistd.h> 2 3 //若出错则返回-1,若成功则不返回值 4 5 int execl(const char *pathname,const char *arg0,.../*(char*)0*/); 6 7 int execv(const char *pathname,char *const argv[]); 8 9 int e 阅读全文
posted @ 2012-07-04 16:48 Cavia 阅读(269) 评论(0) 推荐(0) 编辑
摘要: 1 #include <sys/wait.h>2 3 //若成功则返回进程ID,若出错则返回-14 pid_t wait(int *statloc);5 6 pid_t waitpid(pid_t pid,int *statloc,int options);当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是一个异步事件,所以这种信号也是内核向父进程发送的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数(信号处理程序)。对这种信号的默认动作是忽略它。对任一终止情形,我们都希望终止进程能够通知其父进程它是如何终止的。该终止 阅读全文
posted @ 2012-07-04 15:08 Cavia 阅读(1812) 评论(0) 推荐(0) 编辑
摘要: 进程的正常终止方式有:1、在main函数内执行return语句,等效于调用exit2、调用exit函数,其操作包括调用各个终止处理程序(终止处理程序在调用atexit函数时登记),然后关闭所有标准I/O流3、调用_exit或_Exit函数,为进程提供一种无需运行终止处理程序或信号处理程序而终止的方法。对标准I/O流是否进行冲洗取决于实现。4、进程的最后一个线程在其启动例程中执行返回语句,该线程的返回值不会用作进程的返回值。当最后一个线程从其启动例程返回时,该进程以终止状态0返回5、进程的最后一个线程调用pthread_exit函数,这种情况下进程终止状态总是0进程的异常终止方式有:1、调用ab 阅读全文
posted @ 2012-07-04 14:49 Cavia 阅读(235) 评论(0) 推荐(0) 编辑
摘要: 1 #include <unistd.h>2 3 pid_t fork(void);一个现有进程可以调用fork函数创建一个新进程。由fork函数创建的新进程称为子进程(child process)。fork函数被调用一次,但返回两次。两次返回的唯一区别是子进程的返回值为0,而父进程的返回值则是新子进程的进程ID。将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有的子进程ID。使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getppid获得其父进程ID。子进程和父进程继续执行fork调用之后的指 阅读全文
posted @ 2012-07-04 13:56 Cavia 阅读(1409) 评论(1) 推荐(1) 编辑