C-操作系统编程-simple

子进程创建

fork() 创建子进程, 若成功创建, 其返回值:

  • 对于父进程, 其返回值为子进程的 pid
  • 对于子进程, 其返回值为 0
  • 若创建失败, 返回值为 -1

可以利用返回值来让父/子进程完成不同的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char const *argv[]) {
pid_t cid;

printf("Before fork Process id: %d\n", getpid());

cid = fork();

if (cid == 0) {
printf("Child process id (my parent pid is %d):\
%d\n", getppid(), getpid());
printf("Child do!");
} else {
printf("Parent process id: %d\n", getpid());
printf("Parent do!");

wait(NULL);
}

return 0;
}
  • getpid() 用于获取当前进程 pid
  • getppid() 用于获取父进程 pid
  • wait(Null) 会让父进程等待子进程结束后再返回 (也就是主动进入 waiting 状态)

若观察进程的交替, 可以这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main(int argc, char const *argv[]) {
pid_t cid;

printf("Before fork Process id: %d\n", getpid());

cid = fork();

if (cid == 0) {
printf("Child process id (my parent pid is %d):\
%d\n", getppid(), getpid());
for (int i=0; i<3000; i++) {
printf("Child do!\n");
}
} else {
printf("Parent process id: %d\n", getpid());
for (int i=0; i<3000; i++) {
printf("Parent do!\n");
}

wait(NULL);
}

return 0;
}

C-操作系统编程-simple
http://example.com/2024/08/27/C-操作系统编程-simple/
作者
Jie
发布于
2024年8月27日
许可协议