Подскажите как работать с fork()

Модератор: Модераторы разделов

Ответить
VladVol
Сообщения: 142
ОС: KUbuntu

Подскажите как работать с fork()

Сообщение VladVol »

Доброго времени суток!
Допустим есть две прогрммы, программа А выводит на экран символы "А1" каждые 2 секунды 10 раз, программа Б, выводит на экран символы "Б2" каждую 1 секунду, как запустить программу Б из программы А, при этом не ожидая окончания работы запущенной программы Б?
Другими словами как заставить их работать одновременно? Дали наводку, сказали юзай fork(), как именно его юзать? Делаю fork, программа просто двоится.

Может кто-то объяснить как лучше реализовать мою задачу? Мне бы хоть маленькую наводку)) Заранее спасибо!!
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Подскажите как работать с fork()

Сообщение drBatty »

VladVol писал(а):
20.01.2015 22:23
Другими словами как заставить их работать одновременно? Дали наводку, сказали юзай fork(), как именно его юзать? Делаю fork, программа просто двоится.

man 2 fork
EXAMPLE
See pipe(2) and wait(2).

man 2 wait
EXAMPLE
The following program demonstrates the use of fork(2) and waitpid(). The program creates a
child process. If no command-line argument is supplied to the program, then the child sus‐
pends its execution using pause(2), to allow the user to send signals to the child. Other‐
wise, if a command-line argument is supplied, then the child exits immediately, using the
integer supplied on the command line as the exit status. The parent process executes a loop
that monitors the child using waitpid(), and uses the W*() macros described above to analyze
the wait status value.

The following shell session demonstrates the use of the program:

Код: Выделить всё

           $ ./a.out &
           Child PID is 32360
           [1] 32359
           $ kill -STOP 32360
           stopped by signal 19
           $ kill -CONT 32360
           continued
           $ kill -TERM 32360
           killed by signal 15
           [1]+  Done                    ./a.out
           $

Код: Выделить всё

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

       int
       main(int argc, char *argv[])
       {
           pid_t cpid, w;
           int status;

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

           if (cpid == 0) {            /* Code executed by child */
               printf("Child PID is %ld\n", (long) getpid());
               if (argc == 1)
                   pause();                    /* Wait for signals */
               _exit(atoi(argv[1]));

           } else {                    /* Code executed by parent */
               do {
                   w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);
                   if (w == -1) {
                       perror("waitpid");
                       exit(EXIT_FAILURE);
                   }

                   if (WIFEXITED(status)) {
                       printf("exited, status=%d\n", WEXITSTATUS(status));
                   } else if (WIFSIGNALED(status)) {
                       printf("killed by signal %d\n", WTERMSIG(status));
                   } else if (WIFSTOPPED(status)) {
                       printf("stopped by signal %d\n", WSTOPSIG(status));
                   } else if (WIFCONTINUED(status)) {
                       printf("continued\n");
                   }
               } while (!WIFEXITED(status) && !WIFSIGNALED(status));
               exit(EXIT_SUCCESS);
           }
       }


VladVol писал(а):
20.01.2015 22:23
Делаю fork, программа просто двоится.

ну и отлично. Потом проверяете cpid, если это 0, то значит дочка, иначе — родитель, а cid это PID дочки.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
VladVol
Сообщения: 142
ОС: KUbuntu

Re: Подскажите как работать с fork()

Сообщение VladVol »

drBatty писал(а):
20.01.2015 22:32
VladVol писал(а):
20.01.2015 22:23
Другими словами как заставить их работать одновременно? Дали наводку, сказали юзай fork(), как именно его юзать? Делаю fork, программа просто двоится.

man 2 fork
EXAMPLE
See pipe(2) and wait(2).

man 2 wait
EXAMPLE
The following program demonstrates the use of fork(2) and waitpid(). The program creates a
child process. If no command-line argument is supplied to the program, then the child sus‐
pends its execution using pause(2), to allow the user to send signals to the child. Other‐
wise, if a command-line argument is supplied, then the child exits immediately, using the
integer supplied on the command line as the exit status. The parent process executes a loop
that monitors the child using waitpid(), and uses the W*() macros described above to analyze
the wait status value.

The following shell session demonstrates the use of the program:

Код: Выделить всё

           $ ./a.out &
           Child PID is 32360
           [1] 32359
           $ kill -STOP 32360
           stopped by signal 19
           $ kill -CONT 32360
           continued
           $ kill -TERM 32360
           killed by signal 15
           [1]+  Done                    ./a.out
           $

Код: Выделить всё

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

       int
       main(int argc, char *argv[])
       {
           pid_t cpid, w;
           int status;

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

           if (cpid == 0) {            /* Code executed by child */
               printf("Child PID is %ld\n", (long) getpid());
               if (argc == 1)
                   pause();                    /* Wait for signals */
               _exit(atoi(argv[1]));

           } else {                    /* Code executed by parent */
               do {
                   w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);
                   if (w == -1) {
                       perror("waitpid");
                       exit(EXIT_FAILURE);
                   }

                   if (WIFEXITED(status)) {
                       printf("exited, status=%d\n", WEXITSTATUS(status));
                   } else if (WIFSIGNALED(status)) {
                       printf("killed by signal %d\n", WTERMSIG(status));
                   } else if (WIFSTOPPED(status)) {
                       printf("stopped by signal %d\n", WSTOPSIG(status));
                   } else if (WIFCONTINUED(status)) {
                       printf("continued\n");
                   }
               } while (!WIFEXITED(status) && !WIFSIGNALED(status));
               exit(EXIT_SUCCESS);
           }
       }


VladVol писал(а):
20.01.2015 22:23
Делаю fork, программа просто двоится.

ну и отлично. Потом проверяете cpid, если это 0, то значит дочка, иначе — родитель, а cid это PID дочки.


Спасибо! направление работы понял
Спасибо сказали:
Ответить