c语言多进程多线程编程(2)

2019-08-02 01:35

道描述符,向被执行命令读或写数据(做为被执行命令的STDIN或 STDOUT)该系统调用可以用来在程序中调用系统命令,并取得命令 的输出信息或者向命令输入信息.

返回值:不成功则返回NULL,成功则返回管道的文件指针.

2.5.pclose() 关闭到一个进程的管道

功能:关闭到一个进程的管道. 语法:

#include int pclose(strm) FILE *strm;

说明:本系统调用用于关闭由popen()打开的管道,并会等待由popen() 激活的命令执行结束后,关闭管道后读取命令返回码.

返回值:若关闭的文件描述符不是由popen()打开的,则返回-1. 例子:printf(\ FILE * fd;

if ((fd=popen(\ printf(\ return; }

else {

char str[80];

while (fgets(str,80,fd)!=NULL) printf(\ } pclose(fd);

2.6.wait() 等待一个子进程返回并修改状态

功能:等待一个子进程返回并修改状态 语法:

#include #include pid_t wait(stat_loc) int *stat_loc;

说明:允许调用进程取得子进程的状态信息.调用进程将会挂起直到其 一个子进程终止.

返回值:等待到一个子进程返回时,返回值为该子进程号,否则返回值为 -1.同时stat_loc返回子进程的返回值. 例子:/*父进程*/ if (fork()>0) { wait((int *)0);

/*父进程等待子进程的返回*/ } else {

/*子进程处理过程*/ exit(0); }

2.7.waitpid() 等待指定进程号的子进程的返回并修改状态

功能:等待指定进程号的子进程的返回并修改状态 语法:

#include #include

pid_t waitpid(pid,stat_loc,options) pid_t pid;

int *stat_loc,options;

说明:当pid等于-1,options等于0时,该系统调用等同于wait().否则该 系统调用的行为由参数pid和options决定.

pid指定了一组父进程要求知道其状态的子进程: -1:要求知道任何一个子进程的返回状态.

>0:要求知道进程号为pid值的子进程的状态.

<-1:要求知道进程组号为pid的绝对值的子进程的状态. options参数为以比特方式表示的标志以或运算组成的位图,每个 标志以字节中某个比特置1表示:

WUNTRACED:报告任何未知而又已停止运行的指定进程号的子进 程的状态.该子进程的状态自停止运行时起就没有被报告 过. WCONTINUED:报告任何继续运行的指定进程号的子进程的状态, 该子进程的状态自继续运行起就没有被报告过.

WHOHANG:若调用本系统调用时,指定进程号的子进程的状态目 前并不是立即有效的(即可被立即读取的),调用进程并被 暂停执行. WNOWAIT:保持将其状态设置在stat_loc的进程在可等待状态.

该进程将等待直到下次被要求其返回状态值.

返回值:等待到一个子进程返回时,返回值为该子进程号,否则返回值为 1. 同时stat_loc返回子进程的返回值. 例子:pid_t pid;

int stat_loc; /*父进程*/ if ((pid=\

waitpid(pid,&stat_loc,0);

/*父进程等待进程号为pid的子进程的返回*/ } else {

/*子进程的处理过程*/

exit(1); }

/*父进程*/

printf(\

/*字符串\将被打印出来*/

2.8.setpgrp() 设置进程组号和会话号

功能:设置进程组号和会话号. 语法:

#include pid_t setpgrp()

说明:若调用进程不是会话首进程.将进程组号和会话号都设置为与它 的进程号相等.并释放调用进程的控制终端. 返回值:调用成功后,返回新的进程组号. 例子:/*父进程处理*/ if (fork()>0) { /*父进程处理*/ } else {

setpgrp();

/*子进程的进程组号已修改成与它的进程号相同*/ exit(0); }

2.9.exit() 终止进程

功能:终止进程. 语法:

#include void exit(status) int status;

说明:调用进程被该系统调用终止.引起附加的处理在进程被终止前全 部结束. 返回值:无

2.10.signal() 信号管理功能

功能:信号管理功能 语法:

#include

void (*signal(sig,disp))(int)

int sig;

void (*disp)(int);

void (*sigset(sig,disp))(int) int sig;

void (*disp)(int);

int sighold(sig) int sig;

int sigrelse(sig) int sig;

int sigignore(sig) int sig;

int sigpause(sig) int sig;

说明:这些系统调用提供了应用程序对指定信号的简单的信号处理. signal()和sigset()用于修改信号定位.参数sig指定信号(除了

SIGKILL和SIGSTOP,这两种信号由系统处理,用户程序不能捕捉到). disp指定新的信号定位,即新的信号处理函数指针.可以为 SIG_IGN,SIG_DFL或信号句柄地址.

若使用signal(),disp是信号句柄地址,sig不能为SIGILL,SIGTRAP

或SIGPWR,收到该信号时,系统首先将重置sig的信号句柄为SIG_DFL, 然后执行信号句柄.

若使用sigset(),disp是信号句柄地址,该信号时,系统首先将该 信号加入调用进程的信号掩码中,然后执行信号句柄.当信号句柄 运行结束

后,系统将恢复调用进程的信号掩码为信号收到前的状态.另外, 使用sigset()时,disp为SIG_HOLD,则该信号将会加入调用进程的 信号掩码中而信号的定位不变.

sighold()将信号加入调用进程的信号掩码中. sigrelse()将信号从调用进程的信号掩码中删除.

sigignore()将信号的定位设置为SIG_IGN.

sigpause()将信号从调用进程的信号掩码中删除,同时挂起调用 进程直到收到信号.

若信号SIGCHLD的信号定位为SIG_IGN,则调用进程的子进程在终 止时不会变成僵死进程.调用进程也不用等待子进程返回并做相 应处理.

返回值:调用成功则signal()返回最近调用signal()设置的disp的值. 否则返回SIG_ERR.

例子一:设置用户自己的信号中断处理函数,以SIGINT信号为例: int flag=0;

void myself()

{

flag=1;

printf(\

/*若要重新设置SIGINT信号中断处理函数为本函数则执行以 *下步骤*/ void (*a)(); a=myself;

signal(SIGINT,a); flag=2; }

main()

{

while (1) {

sleep(2000); /*等待中断信号*/ if (flag==1) {

printf(\ exit(0); }

if (flag==2) {

printf(\ printf(\ } } }

2.11.kill() 向一个或一组进程发送一个信号

功能:向一个或一组进程发送一个信号. 语法:

#include #include int kill(pid,sig); pid_t pid; int sig;

说明:本系统调用向一个或一组进程发送一个信号,该信号由参数sig指 定,为系统给出的信号表中的一个.若为0(空信号)则检查错误但 实际上并没有发送信号,用于检查pid的有效性.

pid指定将要被发送信号的进程或进程组.pid若大于0,则信号将 被发送到进程号等于pid的进程;若pid等于0则信号将被发送到所 有的与发送信号进程同在一个进程组的进程(系统的特殊进程除 外);若pid小于-1,则信号将被发送到所有进程组号与pid绝对值 相同的进程;若pid等于-1,则信号将被发送到所有的进程(特殊系 统进程除外).


c语言多进程多线程编程(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:在公司薪酬改革动员会上的讲话

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: