#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
// Curtis
void kloop(int x)
{
int breakCondition;
breakCondition = 0;
while(1)
{
printf("Process %d running\n", x);
sleep(1);
breakCondition = breakCondition + 1;
if (breakCondition == 5)
{
break;
}
}
}
// ---------------
void makeChild()
{
int status;
pid_t pid;
pid = fork();
printf("fork number %d\n", pid);
printf("processid: %d", getpid());
if (pid < 0)
{
printf("You done messed up.\n");
}
else if (pid == 0)
{
printf("You are in child process %d\n", getpid());
}
else
{
printf("You ain't no kid.\n");
}
printf("fork number after if/else: %d\n", pid);
printf("processid after if/else: %d\n", getpid());
}
// ---------------
int main()
{
int status;
int n;
printf("How many child processes do you want to create?\n");
scanf("%d", &n);
printf("\n");
kloop(n);
int i;
for (i=0;i<n;i++)
{
//printf("\t'i' at %d", i);
makeChild();
}
return 0;
}
这是一个.c文件,我正在使用gcc和./a.out在终端中运行它。 当我以前使用过fork时,通常给我的值等于或小于0。 在这种情况下,它看起来像一个processid。
以下是输出示例:
您要创建几个子进程?
1
进程1正在运行
进程1正在运行
进程1正在运行
进程1正在运行
进程1正在运行
货叉号10572
进程ID:10566您不是孩子。
if / else之后的叉号:10572
if / else之后的processid:10566
叉号0
进程ID:10572您处于10572子进程中
if / else之后的叉号:0
if / else之后的processid:10572
答案 0 :(得分:0)
使用fork
的基本模式是这样。
void makeChild() {
pid_t pid = fork();
// Error
if (pid < 0) {
fprintf(stderr, "fork() failed: %s\n", strerror(errno));
}
// Child
else if (pid == 0) {
printf("Child, pid %d, ppid %d\n", getpid(), getppid());
doSomething();
// This is the important piece, the child branch must exit.
exit(0);
}
// Parent
else {
printf("Parent, pid %d. Child pid is %d\n", getpid(), pid);
}
}
父级和子级在fork
之后继续处理。唯一的区别是父母和孩子得到什么。孩子收到0,父母收到孩子的pid。
$ ./test
Parent, pid 35324. Child pid is 35325
Child, pid 35325, ppid 35324
关键的是,一旦孩子完成了所要做的一切, 孩子分支必须退出 ,否则它将继续并运行其余代码。
>