Информация о системе: я использую 64-битную Ubuntu 10.10 на 2-месячном ноутбуке.
Привет всем, у меня есть вопрос о функции fork()
в C. Из ресурсов, которые я использую (Stevens / Rago, YoLinux и Opengroup), я понимаю, что когда вы запускаете процесс, оба родитель и потомок продолжают выполнение следующей команды. Поскольку fork()
возвращает 0
дочернему элементу, а идентификатор процесса дочернего элемента - родительскому, вы можете изменить их поведение с помощью двух операторов if, одного if(pid == 0)
для дочернего элемента и if(pid > 0)
, предполагая, что вы разветвлены с помощью pid = fork()
.
Теперь у меня происходит самое странное. В начале своей основной функции я печатаю stdout
пару аргументов командной строки, которые были назначены переменным. Это первый оператор без присваивания во всей программе, но кажется, что каждый раз, когда я вызываю fork
позже в программе, эти операторы печати выполняются.
Цель моей программы - создать «дерево процессов», в котором каждый процесс имеет двух дочерних элементов, вплоть до глубины 3, создавая таким образом 15 дочерних элементов исходного исполняемого файла. Каждый процесс печатает идентификатор своего родительского процесса и идентификатор процесса до и после разветвления.
Мой код выглядит следующим образом и правильно прокомментирован, аргументы командной строки должны быть "ofile 3 2 -p"
(я еще не дошел до реализации -p/-c
flags):
#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
имеет, казалось бы, правильный формат, но слишком большой для того, что, по моему мнению, должна делать моя программа делать
Любая помощь будет принята с благодарностью.