Chapter 5 - Process Management
This commit is contained in:
15
chp5/atexit.c
Normal file
15
chp5/atexit.c
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
void out(void) {
|
||||||
|
printf("atexit() succeeded!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
if (atexit(out)) {
|
||||||
|
fprintf(stderr, "atexit() failed\n");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
43
chp5/daemon.c
Normal file
43
chp5/daemon.c
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#define NR_OPEN 1048576
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
// create new process
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid == -1) {
|
||||||
|
return -1;
|
||||||
|
} else if (pid != 0) {
|
||||||
|
printf("Running daemon with pid %d\n", pid);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a new session and process group
|
||||||
|
if (setsid() == -1) return -1;
|
||||||
|
|
||||||
|
// set the working directory to the root directory
|
||||||
|
if (chdir("/") == -1) return -1;
|
||||||
|
|
||||||
|
// close all open files--NR_OPEN is overkill, but works
|
||||||
|
for (int i = 0; i < NR_OPEN; i++) {
|
||||||
|
close(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
// redirect fd's 0,1,2 to /dev/null
|
||||||
|
open("/dev/null", O_RDWR); // stdin
|
||||||
|
dup(0); // stdout
|
||||||
|
dup(0); // stderr
|
||||||
|
|
||||||
|
// do its daemon thing
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
printf("Hello from daemon %d\n", getpid());
|
||||||
|
sleep(1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
9
chp5/session.c
Normal file
9
chp5/session.c
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#define _XOPEN_SOURCE 500
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
printf("My session id=%d\n", getsid(0));
|
||||||
|
printf("My process group id=%d\n", getpgid(0));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
63
chp5/system.c
Normal file
63
chp5/system.c
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#define _XOPEN_SOURCE
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
/* my_system - synchronously spawns and waits for the command
|
||||||
|
* "/bin/sh -c <cmd>".
|
||||||
|
*
|
||||||
|
* Returns -1 on error of any sort, or the exit code from the
|
||||||
|
* launched process. Does not block or ignore any signals.
|
||||||
|
*/
|
||||||
|
int my_system(const char *);
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
if (argc < 2) {
|
||||||
|
fprintf(stderr, "usage: %s <command>", argv[0]);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *command = argv[1];
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid == -1) {
|
||||||
|
perror("fork");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
} else if (pid > 0) {
|
||||||
|
int ret = my_system(command);
|
||||||
|
if (ret == -1) {
|
||||||
|
fprintf(stderr, "command: \"%s\" error", command);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int status;
|
||||||
|
wait(&status);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int my_system(const char *cmd) {
|
||||||
|
pid_t pid = fork();
|
||||||
|
if (pid == -1) {
|
||||||
|
return -1;
|
||||||
|
} else if (pid == 0) {
|
||||||
|
const char *argv[4];
|
||||||
|
argv[0] = "sh";
|
||||||
|
argv[1] = "-c";
|
||||||
|
argv[2] = cmd;
|
||||||
|
argv[3] = NULL;
|
||||||
|
|
||||||
|
execv("/bin/sh", argv);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int status;
|
||||||
|
if (waitpid(pid, &status, 0) == -1) {
|
||||||
|
return -1;
|
||||||
|
} else if (WIFEXITED(status)) {
|
||||||
|
return WEXITSTATUS(status);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
31
chp5/wait.c
Normal file
31
chp5/wait.c
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
if (!fork())
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
int status;
|
||||||
|
pid_t pid = wait(&status);
|
||||||
|
if (pid == -1) {
|
||||||
|
perror("wait");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("pid=%d\n", pid);
|
||||||
|
|
||||||
|
if (WIFEXITED(status))
|
||||||
|
printf("Normal termination with exit status=%d\n", WEXITSTATUS(status));
|
||||||
|
|
||||||
|
if (WIFSIGNALED(status))
|
||||||
|
printf("Killed by signal=%d%s\n", WTERMSIG(status), WCOREDUMP(status) ? " (dumped core)" : "");
|
||||||
|
|
||||||
|
if (WIFSTOPPED(status))
|
||||||
|
printf("Stopped by signal=%d\n", WSTOPSIG(status));
|
||||||
|
|
||||||
|
if (WIFCONTINUED(status))
|
||||||
|
printf("Continued\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user