C - 使用 fork() 创建 3 child 个进程
C - Create 3 child processes with fork()
我想用 fork() 创建 3 个 child 进程。这是我创建一个 child 进程的代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void main(){
int pid = fork();
if(pid < 0){
/* was not successfully */
}
else if (pid > 0){
/* Parent process */
}
else{
/* Child process */
for (int i = 0; i < 20; i++){
printf("1");
usleep(1000);
}
exit(0);
}
}
child 进程应该打印 20 次数字 1 并在每次之后休眠 1 毫秒。
我知道我不能只使用 fork() 3 次,因为那样我会得到 7 child 个进程。但是我怎样才能得到 3 呢?我该怎么做,每个 child 进程打印另一个数字?例如第一个进程号1,第二个进程号2,第三个进程号3.
而 parent 应该使用 waitpid() 等待所有 3 children。如果他们完成了 parent 应该打印一条消息。但是这里怎么用waitpid呢?
您可以使用 fork 3 次,但您必须确保 fork 仅从父进程调用。
最简单的方法是确保子项永远不会逃脱其 {} 块。
if((pid = fork())<0) /*handle error*/;
if(pid == 0){
//do child stuff
exit(0); //the child must not escape this {} block
}
//do parent stuff
waitpid(2)很简单。
for (int kid = 0; kid < 3; ++kid) {
int pid = fork();
if(pid < 0){
exit(EXIT_FAILURE);
}
else if (pid > 0){
/* Parent process */
}
else{
/* Child process */
exit(EXIT_SUCCESS);
}
}
for (int kid = 0; kid < 3; ++kid) {
int status;
pid_t pid = wait(&status); // kids could be ready in any order
}
我想用 fork() 创建 3 个 child 进程。这是我创建一个 child 进程的代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
void main(){
int pid = fork();
if(pid < 0){
/* was not successfully */
}
else if (pid > 0){
/* Parent process */
}
else{
/* Child process */
for (int i = 0; i < 20; i++){
printf("1");
usleep(1000);
}
exit(0);
}
}
child 进程应该打印 20 次数字 1 并在每次之后休眠 1 毫秒。
我知道我不能只使用 fork() 3 次,因为那样我会得到 7 child 个进程。但是我怎样才能得到 3 呢?我该怎么做,每个 child 进程打印另一个数字?例如第一个进程号1,第二个进程号2,第三个进程号3.
而 parent 应该使用 waitpid() 等待所有 3 children。如果他们完成了 parent 应该打印一条消息。但是这里怎么用waitpid呢?
您可以使用 fork 3 次,但您必须确保 fork 仅从父进程调用。
最简单的方法是确保子项永远不会逃脱其 {} 块。
if((pid = fork())<0) /*handle error*/;
if(pid == 0){
//do child stuff
exit(0); //the child must not escape this {} block
}
//do parent stuff
waitpid(2)很简单。
for (int kid = 0; kid < 3; ++kid) {
int pid = fork();
if(pid < 0){
exit(EXIT_FAILURE);
}
else if (pid > 0){
/* Parent process */
}
else{
/* Child process */
exit(EXIT_SUCCESS);
}
}
for (int kid = 0; kid < 3; ++kid) {
int status;
pid_t pid = wait(&status); // kids could be ready in any order
}