`
oolala
  • 浏览: 99700 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
09c341db-7f05-3f2b-a572-9ee69a5d8a77
unix环境高级编程
浏览量:21647
社区版块
存档分类
最新评论

Unix环境高级编程笔记:8、进程控制

 
阅读更多
1、进程标识符
    每个进程都有一个非负整型表示的唯一进程ID。
    ID为0的进程通常是调度进程,常常被称为交换进程(swapper)。
    ID为1通常是init进程,在自举过程结束时由内核调用。该进程文件在/etc/init
 
    #include <unistd.h>
    gid_t getegid(void); 获取有效用户ID
    uid_t geteuid(void);
    git_t getgid(void);
    uid_t getuid(void);  获取真实用户ID
 
2、fork
    #include <unistd.h>
    pid_t fork(void);        返回值:子进程中返回0,父进程中返回子进程ID,出错返回-1
    fork函数被调用一次,但返回2次,二次返回的唯一区别是子进程返回值是0,而父进程的返回值是新子进程的进程ID。 
 
    子进程和父进程继续执行fork调用之后的指令。子进程是父进程的副本。例如,子进程获得父进程数据空间、堆和栈的副本。
    父、子进程并不共享这些存储空间部分,父、子进程共享正文段。
 
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
int glob = 6;
char buf[] = "a write to stdout\n";
 
int main(int argc, char **argv) {
int var;
pid_t pid;
 
var = 88;
 
if(write(STDOUT_FILENO,buf,sizeof(buf)-1) != sizeof(buf)-1) {
fprintf(stdout,buf);
exit(1);
}
printf("before fork");
 
if((pid = fork()) <0) {
printf("fork error");
} if(pid == 0) {
glob++;
var ++;
} else {
sleep(2);
}
printf("pid = %d,glob = %d,var = %d\n",getpid(),glob,var);
exit(0);
}
 
 
3、wait和waitpid函数
    当一个进程正常或异常终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步事件。
 
    调用wait或waitpid进程可能发生什么情况:
    a)如果其所有子进程都还在运行,则阻塞。
    b)如果一个子进程已经终止,正等待父进程获取其终止状态,则取得该子进程的终止状态立即返回。
    c)如果它没有任何子进程,则立即返回
 
    #include<sys/wait.h>
    pid_t wait(int *statloc);
    pid_t waitpid(pid_t pid,int *statloc,int options);
    返回值:成功返回进程ID,或出错则返回-1
    两个函数的区别:
    a)在一个子进程终止前,wait使其调用者阻塞,而waitpid有一个选项,可使调用者不阻塞。
    b)waitpid并不等待在其调用之后的第一个终止子进程,它有若干个选项,可以控制它所等待的进程。
 
    这二个函数的参数statloc是一个整形指针,如果statloc不是一个空指针,则终止进程的终止状态就存放在它所指向的单元内。如果不关心终止状态,则可以
    将该参数指定为空指针。
 
    检查wait和waitpid所返回的终止状态的宏
    WIFEXITED(status)
    WIFSIGNALED(status)
    WIFSTOPPED(status)
    WIFCONTINUED(status)
 
    打印进程终止状态
    
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
 
void pr_exit(int status) {
if (WIFEXITED(status)) {
printf("normal termination,exit status   %d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("abnormal termination,signal number = %d%s\n", WTERMSIG(status),
#ifdef WCOREDUMP
WCOREDUMP(status) ? "(core file generated)" : "");
#else
"");
#endif
} else if(WIFSTOPPED(status)) {
printf("child stopped,signal nuber=%d\n",WSTOPSIG(status));
}
}
 
int main(int argc, char **argv) {
pid_t pid;
int status;
if((pid = fork()) <0) {
printf("fork error");
} else if(pid == 0) {
exit(7);
}
 
if(wait(&status) != pid) {
printf("wait");
}
pr_exit(status);
 
exit(0);
}
 
    
如果一个进程有几个子进程,那么只要一个子进程终止,wait就返回。
 
waitpid函数返回终止子进程的进程ID,并将该子进程的终止状态存放在由statloc指向的存储单元中。
pid==-1        等待任一子进程,就这一方面而言,waitpid与wait等效。
pid > 0          等待其进程ID与pid相等的子进程。
pid == 0        等待其组ID等于调用进程组ID的任一子进程。
pid < -1        等待其组ID等于pid绝对值的任一子进程。
 
常量 说明
WCONTINUED
 
WHOHANG
 
WUNTTRACED
若实现支持作业控制,那么由pid指定的任一子进程在暂停后已经继续,但其状态尚未报告,则返回其状态
 
若由pid指定的子进程并不是立即可用的,则waitpid不阻塞,此时其返回0
 
若某实现支持作业控制,而由pid指定的任一子进程处理于暂停状态,并且其状态自暂停以来还未报告过,则返回
其状态
 
 
    waitpid函数区别于wait
    a)waitpid可等待一个特定的进程,而wait则返回任一终止子进程的状态
    b)waitpid提供了一个wait的非阻塞版本
    c)waitpid支持作业控制
 
 
4、waitid
5、wait3 wait4
 
6、竞争条件
    当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序时,则我们认为这发生了竟争条件(race condition)
 
7、exec函数
    当进程调用exec函数时,该 进程执行的程序完全替换为新程序,而新程序则从其main函数开始执行。
    因为调用exec并不创建新进程,所以前后进程的进程ID并未改变。
    exec只是用一个全新的程序替换了当前进程的正文、数据、堆和栈段。
 
    用fork可以创建新进程,用exec可以执行新程序。exit函数和二个wait函数处理终止和等待终止。这些是我们需要的基本的进程控制原语
 
    
#include <unistd.h>
execl
execv
execle
execve
execlp
execvp
返回值 :若出错则返回-1,若成功则不返回值
 
8、更改用户ID和组ID
    在UNIX系统中,特权是基于用户和组ID的。
    当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己的用户ID或组ID,使得新ID具有合适的特权或访问权限。
 
    在设计应用程序时,我们总是试图使用最小特权模型。   
#include <unistd.h>
setuid
setgid
 
9、system   
#include <stdlib.h>
int system(const char *cmdstring);
 
 
10、用户标识
#include <unistd.h>
char *getlogin(void);
 
找到运行该程序的用户登录名:可以调用 getpwuid(getuid())
 
getpwnam 在口令文件中查找用户的相应记录,确定其登录shell
 
 
 
 
 
 
 
 
 
 
 
 
 

 

分享到:
评论

相关推荐

    笔记_UNIX环境网络编程卷二进程间通信_中文第二版.pdf

    笔记_UNIX环境网络编程卷二进程间通信_中文第二版

    UNIX环境高级编程881

    Unix环境高级编程笔记I/O文件系统进程线程进程间通信一.文件I/O三.标准I/O库八.高级I/O二.文件和目录四.进程环境五.进程控制六.线程七.线程控制九

    UNIX环境高级编程

    第1章:UNIX基础知识 ①UNIX体系结构中,最主要的是内核,它有一些称为系统调用的接口与外界交互。在内核之上有shell 和库函数,然后是应用软件。 ②常见的shell有Bourne shell(sh), Bourne_again shell(bash), C ...

    unix学习笔记

    8.网络和资源共享--内部:多进程结构易于资源共享;外部:支持多种网络协议。 9.系统工具和系统服务--100 多个系统工具(即命令),完成各种功能;系统服务用于系统 管理和维护。 Unix操作系统的组成:

    UNIX网络编程第2卷.pdf

    UNIX 网络编程卷 2 进程间通信读书笔记(一)

    unix大全(涵盖了UNIX学习的方方面面)

    整理了包含了unix内核 unix管理 unix调优81文档 1.突破TCP-IP过滤/防火墙进入内网(icmp篇) 2.informix-4gl 7.2编写的通用菜单函数 3.Makefile工具的使用 4.vi用法集锦 5.SCO核心参数详细说明 6.SCO Unix 制作系统...

    Linux读书笔记;推荐书籍.rar

    2.《UNIX环境高级编程》 推荐学习Linux的必读书籍,你是否已经掌握了它们?推荐学习Linux的必读书籍,你是否已经掌握了它们? 虽然这本书并不是专门讲解Linux操作系统的linux学习书籍嵌入式linux 培训,但它对于...

    linux网络编程学习笔记

    IX 只能够用于单一的 Unix 系统进程间通信,而 AF_INET 是针对Internet的,因而可以允许在 远程 主机之间通信(当我们 man socket 时发现 domain 可选项是 PF_*而不是AF_*,因为 glibc 是 posix 的实现 所以用 PF代替...

    shell编程 从入门到精通百度网盘下载地址.

    包括概述、linux文件系统、正则表达式、sed命令和awk编程、文件的排序、合并和分割、变量和引用、操作符、循环与结构化命令、变量的该机用法、I/O重定向、linux/unix shell类型与区别、子shell进程处理、函数、别名...

    我的APUE2读书笔记

    以原书的1-16章为主,包括基本概念、POSIX诸标准、文件、信号、线程、进程间通信等。 参考了一些其它资料结合个人分析,对书中的知识点、重点、难点疑点进行了部分补充。 原连载于 ...

    进程间通信

    这是本人学习期间整理的关于进程间通信的笔记,和一些代码

    UnixProgramming

    这是我学习Unix(主要是linux)系统编程与网络编程的笔记,附上部分源码 系统编程 进程 创建fork 执行exec 销毁wait/waitpid(SIGCHLD) 进程间通信: 匿名管道pipe,命名管道(FIFO)mkfifo System V IPC(还有一组POSIX...

Global site tag (gtag.js) - Google Analytics