Szukaj…
Składnia
- pid_t getpid (void);
- pid_t getppid (void);
- pid_t fork (void);
- pid_t waitpid (pid_t pid, int * wstatus, int opcje);
- int execv (const char * path, char * const argv []);
Parametry
Funkcja, parametry, zwracana wartość | Opis |
---|---|
fork() | nazwa funkcji |
Żaden | nie dotyczy |
Zwraca PID, 0 lub -1 | Proces wywołujący otrzymuje PID nowo utworzonego procesu lub -1 w przypadku niepowodzenia. Dziecko (nowo utworzony proces) otrzymuje 0. W przypadku niepowodzenia ustaw errno na EAGAIN lub ENOMEM |
- | - |
execv() | nazwa funkcji |
const char *path | Ciąg zawierający nazwę pliku wykonywalnego (może zawierać ścieżkę) |
char *const argv[] | Tablica wskaźnika łańcucha jako argumentów |
Zwraca -1 w przypadku niepowodzenia | Po sukcesie ta funkcja nie powraca. |
- | - |
Utwórz proces potomny i poczekaj, aż zakończy się
Ten program pokazuje, jak uruchomić inny proces za pomocą fork()
i czekać na jego zakończenie za pomocą waitpid()
:
fork()
tworzy identyczną kopię bieżącego procesu. Pierwotny proces jest procesem nadrzędnym, podczas gdy nowo utworzony jest procesem potomnym. Oba procesy są kontynuowane dokładnie pofork()
.waitpid()
blokuje, aż proces potomny zakończy działanie lub zakończy działanie i zwróci kod wyjścia oraz przyczynę zakończenia.
#include <unistd.h> /* for fork(), getpid() */
#include <sys/types.h> /* for waitpid() */
#include <sys/wait.h> /* for waitpid() */
#include <stdlib.h> /* for exit() */
#include <stdio.h> /* for printf(), perror() */
int
main(int argc, char *argv[])
{
/* Create child process.
*
* On success, fork() returns the process ID of the child (> 0) to the
* parent and 0 to the child. On error, -1 is returned.
*/
pid_t child_pid = fork();
if (child_pid < 0) {
perror("fork() failed");
exit(EXIT_FAILURE);
} else if (child_pid == 0) {
/* Print message from child process.
*
* getpid() returns the PID (process identifier) of current process,
* which is typically int but doesn't have to be, so we cast it.
*
* getppid() returns the PID of the parent process.
*/
printf("from child: pid=%d, parent_pid=%d\n",
(int)getpid(), (int)getppid());
/* We can do something here, e.g. load another program using exec().
*/
exit(33);
} else if (child_pid > 0) {
/* Print message from parent process.
*/
printf("from parent: pid=%d child_pid=%d\n",
(int)getpid(), (int)child_pid);
/* Wait until child process exits or terminates.
*
* The return value of waitpid() is PID of the child process, while
* its argument is filled with exit code and termination reason.
*/
int status;
pid_t waited_pid = waitpid(child_pid, &status, 0);
if (waited_pid < 0) {
perror("waitpid() failed");
exit(EXIT_FAILURE);
} else if (waited_pid == child_pid) {
if (WIFEXITED(status)) {
/* WIFEXITED(status) returns true if the child has terminated
* normally. In this case WEXITSTATUS(status) returns child's
* exit code.
*/
printf("from parent: child exited with code %d\n",
WEXITSTATUS(status));
}
}
}
exit(EXIT_SUCCESS);
}
Przykładowe dane wyjściowe:
from parent: pid=2486 child_pid=2487
from child: pid=2487, parent_pid=2486
from parent: child exited with code 33
Skopiowano stąd , pierwotnie stworzony przez M.Geigera.
Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow