Доброго времени суток!
Допустим есть две прогрммы, программа А выводит на экран символы "А1" каждые 2 секунды 10 раз, программа Б, выводит на экран символы "Б2" каждую 1 секунду, как запустить программу Б из программы А, при этом не ожидая окончания работы запущенной программы Б?
Другими словами как заставить их работать одновременно? Дали наводку, сказали юзай fork(), как именно его юзать? Делаю fork, программа просто двоится.
Может кто-то объяснить как лучше реализовать мою задачу? Мне бы хоть маленькую наводку)) Заранее спасибо!!
Подскажите как работать с fork()
Модератор: Модераторы разделов
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Подскажите как работать с 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); } }
ну и отлично. Потом проверяете cpid, если это 0, то значит дочка, иначе — родитель, а cid это PID дочки.
-
- Сообщения: 142
- ОС: KUbuntu
Re: Подскажите как работать с fork()
drBatty писал(а): ↑20.01.2015 22:32
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); } }
ну и отлично. Потом проверяете cpid, если это 0, то значит дочка, иначе — родитель, а cid это PID дочки.
Спасибо! направление работы понял