The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"execl из форкнутого потомка"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"execl из форкнутого потомка"  +/
Сообщение от freelan (ok) on 26-Май-09, 12:56 
Доброго, есть код, который должен создавать потомка процесса и из этого потомка вызывать стороннюю программу в данном случае sort, имя сортируемого файла и доп ключ принимаем из консоли, строка запска execl (SHELL, argv[0], argv[1], NULL); в потомке. Компилируется без ошибок, при выполнении программы не доходит до этой сторки execl (SHELL, argv[0], argv[1], NULL);

Tesla:# ./orderfile -b orderfile.c


*******PARENT*******
PARENT: PID - 12927
PARENT: PID my CHILD 12928
PARENT: i wait to exit()...
PARENT: code exit CHILD:0
PARENT: Exit!


*******CHILD*******
CHILD: PID - 12928
CHILD: PID my PARENT - 1
Tesla:#

из-за чего, в чём проблема?

сам код:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stddef.h>

#define SHELL "sort"


int main(int argc, char* argv[4])
{


//data type
pid_t pid;
int rv;


pid=fork();


if(pid == -1)
{
perror("fork");
exit(1);
}

//this process PARENT
if(pid != 0)
{
printf("\n\n*******PARENT*******\n");
printf(" PARENT: PID - %d\n", getpid());
printf(" PARENT: PID my CHILD %d\n", pid);
printf(" PARENT: i wait to exit()...\n");


// wait(); //!!?!?!??!??!?!??!?!?!

printf(" PARENT: code exit CHILD:%d\n",WEXITSTATUS(rv));
printf(" PARENT: Exit!\n");

}


//this process CHILD
if(pid == 0)
{

printf("\n\n*******CHILD*******\n");
printf(" CHILD: PID - %d\n", getpid());
printf(" CHILD: PID my PARENT - %d\n",getppid());

printf("%s,---%s",argv[0],argv[1]);


execl (SHELL, argv[0], argv[1], NULL);
_exit (EXIT_FAILURE); //without updating flow
}


}

спасибо за внимание.
             

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "execl из форкнутого потомка"  +/
Сообщение от freelan (ok) on 26-Май-09, 15:17 
подправил код, теперь sort работает

[C]
//NAME PROG orderfile.c

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stddef.h>

#define PATH "/usr/bin/sort"
#define SORT "sort"

int main(int argc, char* argv[])
{


//data type
  pid_t pid;
  int rv;

//create new process
  pid=fork();


  if(pid == -1)
  {
      perror("fork");  
      exit(1);  
  }

//this process PARENT
  if(pid != 0)
  {
       printf("\n\n*******PARENT*******\n");
       printf(" PARENT: PID - %d\n", getpid());
       printf(" PARENT: PID my CHILD %d\n", pid);
       printf(" PARENT: i wait to exit()...\n");

//       wait(); //!!?!?!??!??!?!??!?!?!
       printf(" PARENT: code exit CHILD:%d\n",WEXITSTATUS(rv));
       printf(" PARENT: Exit!\n");
  
  }


//this process CHILD
  if(pid == 0)
  {
       printf("\n\n*******CHILD*******\n");
       printf(" CHILD: PID - %d\n", getpid());
       printf(" CHILD: PID my PARENT - %d\n",getppid());
      
       printf("ARG0 - %s, ARG1 - %s ",argv[0],argv[1]);
       printf("\n@@@@@@@Print file SORT:@@@@@@@\n");

       execl (PATH, SORT, argv[1], argv[2], NULL);
       _exit (EXIT_FAILURE); //without updating flow
  }


}


[/C]

начитался манов
https://www.opennet.ru/docs/RUS/glibc/glibc-23.html
https://www.opennet.ru/docs/RUS/ipcbook/node7.html
man fork
man exec

теперь хотелось бы изложить ход понимания происходящего, верно ли всё осознаю

1)  pid=fork()
породил в памяти новый процесс который идентичен текущему "запущеной программе orderfile.c" отличается лишь PID. операционная система переключилась на вновь созданый процесс во вновь созданом "дочернем процессе" был отработан  if(pid == 0) ибо как гласит man дочерний процесс в качестве аргумента дескриптора pid_t получает 0.
После чего управление переместилось в процесс родитея где был получе pid поломка и отработало условие     if(pid != 0).
всё ли верно изложил? подправьте дополните, спасибо.


Теперь хочу организовать механизм ожидания завершения работы потомка, в манах обнаружил что это можно реализовать используя функцию wait()

[C]
  if(pid != 0)
  {
       printf("\n\n*******PARENT*******\n");
       printf(" PARENT: PID - %d\n", getpid());
       printf(" PARENT: PID my CHILD %d\n", pid);
       printf(" PARENT: i wait to exit()...\n");

//       wait(); //!!?!?!??!??!?!??!?!?!!!??!??!?????
       printf(" PARENT: code exit CHILD:%d\n",WEXITSTATUS(rv));
       printf(" PARENT: Exit!\n");
  
  }
[/C]

котороя будет ждать возврата кода от потомка и посредством макроса WEXITSTATUS вывести его результат
но при использовании даной фции компилер ругается
orderfile.c:42: error: too few arguments to function ‘wait’
мало этой фции видите ли параметров, что за параметры? почему и зачем?

по поводу wait нет чёткого понимания. подскажите.
спасибо.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "execl из форкнутого потомка"  +/
Сообщение от RomanCh (ok) on 27-Май-09, 15:13 
>[оверквотинг удален]
>
>котороя будет ждать возврата кода от потомка и посредством макроса WEXITSTATUS вывести
>его результат
>но при использовании даной фции компилер ругается
>orderfile.c:42: error: too few arguments to function ‘wait’
>мало этой фции видите ли параметров, что за параметры? почему и зачем?
>
>
>по поводу wait нет чёткого понимания. подскажите.
>спасибо.

Гм, man 2 wait внимательно читали?

pid_t wait(int *status);

На пальцах:
int main(int argc, char *argv[])
{
    pid_t pid = fork();
    if(pid)
    {
        int status;
        printf("I'm a parent. Awaiting child. Pid: %d\n", pid);
        wait(&status);
        printf("Cild finished. Status: %d\n", WEXITSTATUS(status));
    }
    else
    {
        printf("I'm a child. Sleeping 3 seconds.\n");
        srand(time(0));
        sleep(3);
        return (char) rand();
    }
    return 0;
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру