for()函数使用
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
int i;
pid_t pid;
printf("pragram is running ...");
// 创建子进程
pid = fork();
if (pid == -1){
// 异常
printf("fork error !!!");
exit(1);
} else if (pid == 0) {
// 子进程逻辑
break;
} else if (pid > 0) {
// 父进程逻辑
}
return 0;
}
正确创建N个子进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
int i;
pid_t pid;
printf("pragram is running ...");
for (int i = 0; i < 5; i++) {
pid = fork();
if (pid == -1){
// error
printf("fork error !!!");
exit(1);
} else if (pid == 0) {
// 子进程逻辑
break;
} else if (pid > 0) {
// 父进程逻辑
}
}
sleep(i); // 保证输出顺序
if (i < 5) {
printf("I'am child %d , pid = %u\n", i + 1, getpid());
} else {
printf("I'am parent\n");
}
return 0;
}
父子进程相同处:全局变量、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式、.data、.text...
父子进程不同处:进程ID、fork()返回值、父进程ID、进程运行时间、定时器、未决信号集
父子进程间遵循 读时共享,写时复制
注意误区:刚fork()之后相同处不代表共享,比如:父子进程的全局变量不共享。
父子进程共享:1.文件描述符(打开文件结构体) 2.mmap建立的映射区(进程间通信)
父子进程fork之后先后执行顺序不确定,取决于内核所使用的调度算法随机争夺。
gdb调试
> gcc main.c -g
> gdb a.out
命令
list 列出代码设置断点,简写l
breakpoint <行号> 设置断点
breakpoint <行号> [if <条件>] 条件断点
next 下一步
run 运行
start 单步执行
print <变量> 打印变量值
set follow-fork-mode child 设置gdb在fork之后跟踪子进程(fork调用前设置生效)
set follow-fork-mode parent 设置gdb在fork之后跟踪父进程(fork调用前设置生效)