LINUX.ORG.RU

fork()

 ,


0

1

Здравствуйте, можете подсказать в чем ошибка?

Задача Написать программу которая вызывает функцию fork() 3 раза, например в цикле(петле) и выпишите указанные выше идентификаторы для всех дочерних процессов. На основании результата выписать «генеалогическое дерево» создаваемых процессов. Сколько создаеться процессов и почему?

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/wait.h>

void identifiers(); // function that display identifiers

void forkMethod(); // function that calls fork() function 3 times

void tree(int pid); // function displaying processes tree

int main(void)

{

identifiers();

printf("Parent pid: %d\n", getpid());

printf("Child processes: \n");


forkMethod();



return 0;

}

void forkMethod()

{

int k;

int status;

int pid;


for(k = 0; k < 3; k++)
{
	pid = fork();
		switch(pid)
		{
			case -1:
				perror("fork error");
				exit(EXIT_FAILURE);
				break;
			case 0:
				identifiers;
				exit(0);
			default:
				tree(getpid());
				wait(&status);
				sleep(1);
				break;
		}
}

}

void identifiers()

{

pid_t pid = getpid();

pid_t ppid = getppid();

pid_t uid = getuid();


pid_t gid = getgid();

printf("\nPID:%d PPID:%d UID:%d GID:%d\n", pid, ppid, 

uid, gid);

}

void tree(int pid)

{

char pstree[] = "pstree -np";

char cmd[12];

sprintf(cmd, "%s%d", pstree, pid);

system(cmd);

}

Здравствуйте, можете подсказать в чем ошибка?

В задании. Оно тупое. А так, нахрена тебе отдельно массив под pstree если ты можешь всё так вписать в sprintf и получить заветные.

PID:508800 PPID:508577 UID:1000 GID:1000
Parent pid: 508800
Child processes: 
a.out(508800)─┬─a.out(508801)
              └─sh(508802)───pstree(508803)
a.out(508800)─┬─a.out(508804)
              └─sh(508805)───pstree(508806)
a.out(508800)─┬─a.out(508807)
              └─sh(508808)───pstree(508809)

Намёк понял?

anonymous ()
Ответ на: комментарий от i-rinat

Очевидно же, что хотел, чтобы написали fork(); fork(); fork();, и без хотя бы легкого понимания, почему нафоркалось

  0
  +-----+-----+
  |     |     |
  v     v     v
  1 ->  2 ->  3
  |     |
  |     +--> 23
  |
  +--> 12 -> 13
        |
        +-->123

его лысые седины не беспокоили

t184256 ★★★★★ ()

У тебя 2 незначительные ошибки:

  1. Буфер cmd слишком мал. После заданной строки он может вместить только 1 цифру и завершающий 0.

  2. Между командой с опциями и свободным аргументом (pid’ом) нет пробела, поэтому цифры pid’а воспринимаются как опции.

Соответственно, вместо char cmd[12]; напиши char cmd [17]; хотя бы, а вместо sprintf(cmd, "%s%d", pstree, pid);sprintf(cmd, "%s %d", pstree, pid); с пробелом между %s и %d.

Но и в этом случае помимо форкнутых процессов в твоём дереве появятся оболочки, запущенные вызовом system(). Поэтому, как тебе уже написали, system лучше убрать и всё выводить printf’ами из основной программы (можно из родительского процесса, как ты делаешь, или из дочернего через getpid()).

aureliano15 ★★ ()
Ответ на: комментарий от t184256

че-то я слегка хрень нарисовал, но лень перерисовывать

t184256 ★★★★★ ()
Ответ на: комментарий от anonymous

В задании.

А может вы с ТСом тупите? Скорее всего задание то нормальное, показать самостоятельно дерево процессов от вложенного fork-а, без pstree.

vodz ★★★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей