Информация о системе: я использую 64-битную Ubuntu 10.10 на ноутбуке двухмесячной давности.
Привет всем, у меня есть вопрос о функции fork() в C. Из ресурсов, которые я использую (Stevens/Rago, YoLinux и Opengroup), я понимаю, что когда вы разветвляете процесс, как родитель, так и дочерний продолжить выполнение со следующей команды. Поскольку fork() возвращает 0 дочернему элементу, а идентификатор процесса дочернего элемента - родительскому, вы можете изменить их поведение с помощью двух операторов if, одного if(pid = 0) для дочернего элемента и if(pid > 0), предполагая вы разветвились с помощью pid = fork().
Теперь у меня происходит самое странное. В начале моей основной функции я вывожу на стандартный вывод пару аргументов командной строки, которые были назначены переменным. Это первый оператор без присваивания во всей программе, однако, может показаться, что иногда, когда я вызываю fork позже в программе, этот оператор печати выполняется.
Целью моей программы является создание «дерева процессов», в котором каждый процесс имеет двух дочерних элементов, вплоть до глубины 3, таким образом создавая 14 дочерних элементов исходного исполняемого файла. Каждый процесс печатает идентификатор своего родительского процесса и свой идентификатор процесса до и после разветвления.
Мой код выглядит следующим образом и правильно прокомментирован, аргументы командной строки должны быть «ofile 3 2 -p» (я еще не реализовал флаги -p/-c):
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
if(argc != 5)//checks for correct amount of arguments
{
return 0;
}
FILE * ofile;//file to write to
pid_t pid = 1;//holds child process id
int depth = atoi(argv[2]);//depth of the process tree
int arity = atoi(argv[3]);//number of children each process should have
printf("%d%d", depth, arity);
ofile = fopen(argv[1], "w+");//opens specified file for writing
int a = 0;//counter for arity
int d = 0;//counter for depth
while(a < arity && d < depth)//makes sure depth and arity are within limits, if the children reach too high(low?) of a depth, loop fails to execute
//and if the process has forked arity times, then the loop fails to execute
{
fprintf(ofile, "before fork: parent's pid: %d, current pid: %d\n", getppid(), getpid());//prints parent and self id to buffer
pid = fork(); //forks program
if(pid == 0)//executes for child
{
fprintf(ofile, "after fork (child):parent's pid: %d, current pid: %d\n", getppid(), getpid());//prints parent's id and self id to buffer
a=-1;//resets arity to 0 (after current iteration of loop is finished), so new process makes correct number of children
d++;//increases depth counter for child and all of its children
}
if(pid > 0)//executes for parent process
{
waitpid(pid, NULL, 0);//waits on child to execute to print status
fprintf(ofile, "after fork (parent):parent's pid: %d, current pid: %d\n", getppid(), getpid());//prints parent's id and self id to buffer
}
a++;//increments arity counter
}
fclose(ofile);
}
Когда я запускаю «gcc main.c -o ptree», а затем «ptree ofile 3 2 -p», консоль несколько раз спамит «32», а файл «ofile» имеет, казалось бы, правильный формат, но немного слишком большой для того, что, как я думаю, должна делать моя программа, показывая 34 дочерних процесса, когда должно быть 2 ^ 3 + 2 ^ 2 + 2 ^ 1 = 14. Я думаю, что это как-то связано с утверждением, которое печатает «32», так как это, возможно, порождает больше вилок, чем предполагалось.
Любая помощь будет принята с благодарностью.