POSIX
processer
Sök…
Syntax
- pid_t getpid (void);
- pid_t getppid (void);
- pid_t gaffel (ogiltig);
- pid_t waitpid (pid_t pid, int * wstatus, int-alternativ);
- int execv (const char * path, char * const argv []);
parametrar
Funktion, parameter (er), returvärde | Beskrivning |
---|---|
fork() | funktionsnamn |
ingen | n / a |
Returnerar PID, 0 eller -1 | Samtalsprocessen får PID för den nyligen skapade processen eller -1 vid misslyckande. Barnet (den nyligen skapade processen) får 0. I händelse av fel ställer errno till antingen EAGAIN eller ENOMEM |
- | - |
execv() | funktionsnamn |
const char *path | Sträng som innehåller namnet på den körbara (kan inlcude sökväg) |
char *const argv[] | Array av strängpekaren som argument |
Returnerar -1 vid misslyckande | Vid framgång återgår inte denna funktion. |
- | - |
Skapa barnprocess och vänta tills den går ut
Detta program visar hur man kör en annan process med fork()
och väntar på att den avslutas med waitpid()
:
fork()
skapar en identisk kopia av den aktuella processen. Den ursprungliga processen är överordnad process, medan den nyligen skapade är barnprocessen. Båda processerna fortsätter exakt efterfork()
.waitpid()
blockeras tills barnprocessen lämnar eller avslutas och returnerar sin utgångskod och avslutningsskäl.
#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);
}
Exempel på utgång:
from parent: pid=2486 child_pid=2487
from child: pid=2487, parent_pid=2486
from parent: child exited with code 33
Kopierad härifrån , ursprungligen skapad av M.Geiger.
Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow