嵌入式开发学习———Linux环境下IO进程线程学习(四)
本文介绍了进程相关的系统调用函数及其应用。主要内容包括:1) fork创建子进程,父进程返回子进程PID,子进程返回0;2) getpid/getppid获取当前/父进程PID;3) wait/waitpid用于等待子进程终止;4) exit/_exit终止进程的两种方式。并提供了两个编程实例:1) 进程扇结构,父进程创建多个子进程;2) 进程链结构,父进程创建子进程,子进程继续创建孙进程,形成多
·
进程相关函数
fork
创建一个子进程,子进程复制父进程的地址空间。父进程返回子进程PID,子进程返回0。
pid_t pid = fork();
if (pid == 0) { /* 子进程代码 */ }
else { /* 父进程代码 */ }
getpid
获取当前进程的PID。
pid_t pid = getpid();
getppid
获取父进程的PID。
pid_t ppid = getppid();
wait
阻塞等待任意子进程结束,返回终止子进程的PID。
int status;
pid_t child_pid = wait(&status);
waitpid
等待指定子进程结束,可设置非阻塞选项。
int status;
pid_t child_pid = waitpid(pid, &status, WNOHANG);
exit
正常终止进程,清理I/O缓冲区。
exit(0); // 0表示成功
_exit
立即终止进程,不清理缓冲区。
_exit(1); // 1表示失败

作业:
1.创建一个进程扇
父
子1 子2 子3......
#include <myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid1,pid2,pid3;
if((pid1=fork())==0)
{
//sleep(1);
puts("这是子进程1!");
}
else if(pid1>0)
{
if((pid2=fork())==0)
{
//sleep(2);
puts("这是子进程2!");
}
else if(pid2>0)
{
if((pid3=fork())==0)
{
//sleep(3);
puts("这是子进程3!");
}
else if(pid3>0)
{
puts("这是父进程!");
//waitpid(pid3,NULL,0);
}
else
ERROR_MSG("pid3=fork error");
}
else
ERROR_MSG("pid2=fork error");
}
else
ERROR_MSG("pid1=fork error");
while(1);
return 0;
}
运行结果:
2.创建一个进程链
父 ---- 子 ---- 孙 ---- 曾孙
#include <myhead.h>
int main(int argc, const char *argv[])
{
pid_t pid1,pid2,pid3;
if((pid1=fork())==0)
{
if((pid2=fork())==0)
{
if((pid3=fork())==0)
{
puts("这是曾孙进程!");
}
else if(pid3>0)
{
puts("这是孙子进程!");
}
else
ERROR_MSG("pid3=fork error");
}
else if(pid2>0)
{
puts("这是子进程!");
}
else
ERROR_MSG("pid2=fork error");
}
else if(pid1>0)
{
puts("这是父进程!");
waitpid(pid3,NULL,0);
}
else
ERROR_MSG("pid1=fork error");
while(1);
return 0;
}
运行结果:
3.牛客网


更多推荐



所有评论(0)