70 lines
3.3 KiB
C++
Raw Normal View History

2024-11-23 11:00:35 +00:00
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
int main() {
// 进程标识(pid)
// pid_t getpid(void); 当前进程
// pid_t getppid(void); 父进程
// fork() 函数
// pid_t fork(void); 创建一个子进程,父进程返回pid子进程返回0,失败返回-1,设置errno
2024-11-23 11:00:35 +00:00
// 子进程获取父进程 数据空间,堆,栈 的副本,并不是共享
// 若父进程比子进程先退出那么子进程由1号进程托管
// 若子进程先退出,而父进程没处理,则会造成僵尸进程(No!)
pid_t pid;
pid = fork(); //创建一个子进程
if(pid != 0) cout << "是父进程" << getpid() << endl;
else if(pid == 0) cout << "是子进程" << getpid() << endl;
else cout << "进程创建失败" << endl;
// 僵尸进程的避免
// 1.
// signal(SIGCHLD, SIG_IGN); 忽略子进程退出的信息,交由系统处理
//
// 2. 使用wait()/waitpid() 阻塞等待子进程结束
// pid_t wait(int *stat_loc); 返回子进程pid
// pid_t waitpid(pid_t pid, int *stat_loc, int options);
//
// stat_loc是进程终止的信息
// a. 正常终止 WIFEXITED(stat_loc) 返回真 WEXITSTATUS(stat_loc)获取终止信息
// b. 异常终止 WTERMSIG(stat_loc) 获取终止进程的信号
//
// 3. 收到SIGCHLD信号后wait() 相当于非阻塞,不影响父进程
if(pid != 0) {
int status;
pid = wait(&status);
cout << "进程" << pid;
if(WIFEXITED(status)) cout << "正常终止" << endl;
else cout << "" << WTERMSIG(status) << "信号异常终止" << endl;
} else sleep(100);
return 0;
}
// 当使用fork创建子进程时子进程会继承父进程的资源
/*
1. ****访
2. ****
3. ****
4. ****
5. ****
6. ****CPU时间
7. **ID**ID
8. **ID和组ID**ID和组ID
9. ****
10. ****
11. ****
12. ****
13. ****
14. ****使
- **ID**ID
- **线**线线线
- **CPU寄存器**CPU寄存器状态是复制自父进程的
*/