Linux系统编程
来源:互联网 发布:淘宝助手怎么导出订单 编辑:程序博客网 时间:2024/06/06 10:46
wait()和waitpid()
函数说明
wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接收到了一个指定的信号为止。如果该父进程没有子进程或者它的子进程已经结束,则wait()函数就会立即返回。
waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程(它可以指定需要等待终止的子进程),它还有若干选项,如可提供一个非阻塞版本的 wait()功能,也能支持作业控制。实际上,wait()函数只是 waitpid()函数的一个特例,在Linux 内部实现 wait()函数时直接调用的就是waitpid()函数。
函数格式
下图为wait()函数的格式
下图为waitpid()函数的格式
基础实验
实验1
本实验中首先使用fork()创建一个子进程,然后让其子进程暂停5s(使用了sleep()函数)。接下来对原有的父进程使用waitpid()函数,并使用参数WNOHANG是该父进程不会阻塞。若有子进程退出,则waitpid()返回子进程号;若没有子进程退出,则waitpid()返回0,并且父进程每隔1s循环判断一次。该程序的流程图如下:
程序源代码我上传到网站,可以免费下载waitpid.c文件,点此下载
下载文件后,使用命令:gcc waitpid.c -o waitpid
然后执行命令:./waitpid 结果如下图;
从输出结果就可以看出程序的执行流程。先执行一次父进程,父进程睡眠1s,此时执行子进程,然后子进程睡眠5秒;接着再执行父进程监听。哎哟我去我不分析流程了,怕再说迷糊了。
实验2
本实验使用函数wait(),同实验2一样,也是先用fork()新建一个子进程,然后让子进程暂停5s。接下来对原有的父进程使用wait()函数。不同的是,wait()函数会使得父进程阻塞,通过本实验的结果就可以看出。代码如下:
执行结果如下图
我建议你亲自实验一下,能很明显的看出不同。wait.c文件点此下载
/* wait.c文件*/
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t pc,pr;
pc=fork();/*创建新子进程*/
if(pc<0)
{
printf("Error fork\n");
}
else if(pc==0) /* 子进程 */
{
/*子进程暂停5s*/
printf("I am the child progress.I am going sleep!\n");
sleep(5);
/*子进程正常退出*/
printf("I am the child progress.I am going exit!\n");
exit(0);
}
else /*父进程*/
{
pr=wait(NULL);
if(pr<0)
{
printf("Some error occured.\n");
}
printf("I am the father progress.I get child exit code:%d\n",pr);
}
}
/* waitpid.c */
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
pid_t pc,pr;
pc=fork();/*创建新的子进程*/
if(pc<0) /*出错处理*/
{
printf("Error fork\n");
}
else if(pc==0) /*子进程*/
{
/*子进程暂停5s*/
printf("I am the child progress.I am going sleep!\n");
sleep(5);
printf("I am the child progress.I am going exit!\n");
/*子进程正常退出*/
exit(0);
}
else /*父进程*/
{
/*循环测试子进程是否退出*/
do
{
/*调用waitpid(),且父进程不阻塞*/
pr=waitpid(pc,NULL,WNOHANG);
/*若子进程还未退出,则父进程暂停1s*/
if(pr==0) /*返回0说明子进程没有退出*/
{
printf("I am the father progress.The child process has not exited\n");
sleep(1);
}
} while(pr==0);
/*若发现子进程退出,打印出相应情况*/
if(pr==pc)
{
printf("I am the father progress.I get child exit code:%d\n",pr);
}
else
{
printf("Some error occured.\n");
}
}
}
- Linux系统编程---socket编程
- [Linux系统编程]Curses编程
- linux系统编程--系统调用
- Linux系统多线程编程
- Linux 系统编程
- unix/linux系统编程
- Linux系统编程概略
- Linux系统编程
- Linux系统编程学习心得
- linux系统日志编程
- 什么是linux系统编程
- Linux系统编程简介
- linux系统编程--信号
- linux系统编程1
- linux系统编程2
- linux系统编程3
- linux系统编程4
- linux系统编程5
- log4j中配置日志文件相对路径
- Endeca Install Problem ‘JDBC driver does not support XA, hence cannot be a participant in to-phase c
- 详解android:scaleType属性
- ios开发 如何利用 友盟统计 或者 百度统计 进行 错误分析
- 双调排序的简单实现
- Linux系统编程
- JAVA 习得2
- Xcode 常用快捷键及代码自动排版
- swift学习(二)值与类型
- log4j.properties配置详解
- calloc() 和malloc() 有什么区别?
- Javascript之DOM(Document对象2)
- IT精英编写盗号“秘方” 5个月窃取400多万QQ号
- 【转】ssh scp 免密码方法