Initial commit
This commit is contained in:
66
kapitel16/daemon-ex1.c
Normal file
66
kapitel16/daemon-ex1.c
Normal file
@@ -0,0 +1,66 @@
|
||||
#define _XOPEN_SOURCE 500
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
int main(void)
|
||||
{
|
||||
pid_t process_id = 0;
|
||||
pid_t sid = 0;
|
||||
/* Skapa barn/child process */
|
||||
process_id = fork();
|
||||
/* Hantera eventuellt fel vid fork() */
|
||||
if (process_id < 0)
|
||||
{
|
||||
fprintf(stderr, "fork failed!\n");
|
||||
exit(1);
|
||||
}
|
||||
/* Förälderprocessen/parent process. Avsluta den */
|
||||
else if (process_id > 0)
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
/* Starta en ny session */
|
||||
sid = setsid();
|
||||
if(sid < 0)
|
||||
{
|
||||
/* Avsluta ifall det inte gick att skapa en ny
|
||||
session */
|
||||
fprintf(stderr, "Failure to set new session\n");
|
||||
exit(1);
|
||||
}
|
||||
/* Gör en ny fork (dubbel-fork). Detta blir demonen */
|
||||
process_id = fork();
|
||||
/* Hantera eventuellt fel vid fork() */
|
||||
if (process_id < 0)
|
||||
{
|
||||
fprintf(stderr, "fork failed!\n");
|
||||
exit(1);
|
||||
}
|
||||
/* Förälderprocessen/parent process.
|
||||
Avsluta den eftersom allt arbete kommer att
|
||||
utföras av demonen. Skriv också ut demonens PID */
|
||||
else if (process_id > 0)
|
||||
{
|
||||
printf("Daemon process: %d \n", process_id);
|
||||
exit(0);
|
||||
}
|
||||
/* Sätt umask till 022 (rw-r--r-- / rwx-r-xr-x) */
|
||||
umask(022);
|
||||
/* Ändra aktuell katalog till / */
|
||||
chdir("/");
|
||||
/* Stäng stdin, stdout och stderr och återöppna dem till
|
||||
/dev/null. Dessa behövs inte i en demonprocess */
|
||||
close(STDIN_FILENO);
|
||||
close(STDOUT_FILENO);
|
||||
close(STDERR_FILENO);
|
||||
open("/dev/null", O_RDONLY); /* 0 = stdin */
|
||||
open("/dev/null", O_WRONLY); /* 1 = stdout */
|
||||
open("/dev/null", O_RDWR); /* 2 = stderr */
|
||||
/* Här börjar demonens arbete... */
|
||||
for(;;)
|
||||
{
|
||||
sleep(5);
|
||||
}
|
||||
}
|
12
kapitel16/execldemo.c
Normal file
12
kapitel16/execldemo.c
Normal file
@@ -0,0 +1,12 @@
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
sleep(15);
|
||||
execl("/usr/bin/man", "man", "ls", (char *)NULL);
|
||||
perror("execl");
|
||||
|
||||
return 0;
|
||||
}
|
29
kapitel16/forkdemo-ex2.c
Normal file
29
kapitel16/forkdemo-ex2.c
Normal file
@@ -0,0 +1,29 @@
|
||||
#define _XOPEN_SOURCE 500
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
pid_t pid;
|
||||
int status;
|
||||
pid = fork();
|
||||
if (pid == 0)
|
||||
{
|
||||
execl("/usr/bin/man", "man", "ls", (char *)NULL);
|
||||
perror("execl");
|
||||
}
|
||||
else if (pid > 0)
|
||||
{
|
||||
waitpid(pid, &status, 0);
|
||||
printf("Barnet är klart, återgår till förälderprocessen\n");
|
||||
printf("Barnet returnerade %i\n", status);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Något gick fel med fork()\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
25
kapitel16/forkdemo.c
Normal file
25
kapitel16/forkdemo.c
Normal file
@@ -0,0 +1,25 @@
|
||||
#define _XOPEN_SOURCE 500
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
pid_t pid;
|
||||
pid = fork();
|
||||
if (pid == 0)
|
||||
{
|
||||
printf("Jag är barnprocessen\n");
|
||||
sleep(30);
|
||||
}
|
||||
else if (pid > 0)
|
||||
{
|
||||
printf("Jag är förälderprocessen\n");
|
||||
sleep(30);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Något gick fel med fork()\n");
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
9
kapitel16/systest.c
Normal file
9
kapitel16/systest.c
Normal file
@@ -0,0 +1,9 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
if (system("man ls") == -1)
|
||||
fprintf(stderr, "Could not create child process\n");
|
||||
return 0;
|
||||
}
|
28
kapitel16/zombie.c
Normal file
28
kapitel16/zombie.c
Normal file
@@ -0,0 +1,28 @@
|
||||
#define _XOPEN_SOURCE 500
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
pid_t pid;
|
||||
pid = fork();
|
||||
if (pid == 0)
|
||||
{
|
||||
printf("Jag är barnprocessen och kommer bli en zombie\n");
|
||||
exit(0);
|
||||
}
|
||||
else if (pid > 0)
|
||||
{
|
||||
printf("Jag är föräldern och kommer att köras i "
|
||||
"100 sekunder\n");
|
||||
sleep(100);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stderr, "Något gick fel med fork()\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user