signal(int signum, sighandler_t handler)
=> signal(semnal, functie_handler)
void functie_handler() { ... }
signal(signum, SIG_IGN)
kill(pid, sig)
(sau comanda shell kill -<semnal> <PID>
, ex. kill -9 1234
)int pipe(int fd[2])
- pipe-uri anonime (numai între procese “înrudite”)
read()
/ write()
- citire din / scriere în pipeclose()
- închidere pipedup2(int oldfd, int newfd)
- duplicarea unui file descriptor (inclusiv un pipe)
dup2(p[1], 1)
suprascrie handlerul de ieșire standard (stdout
) cu conținutul lui p[1]
(redirectare)mkfifo [-m mode] <path>
(shell) / int mkfifo(char *pathname, mode_t mode)
(C) - pipe-uri cu nume
mkfifo ~/mypipe
mode
= permisiunile fișierului (ex. 0666
= rw-rw-rw-
)
mkfifo -m 0640 /tmp/mypipe
/ mkfifo("/tmp/mypipe", S_IFIFO|0644)
pipe() / close():
int fd[2];
pipe(fd);
if (fork() == 0)
{
// copil
char buf[10];
close(fd[0]);
if (read(fd[1], buf, 3) != 3)
{
perror("Esec!");
exit(1);
}
...
exit(0);
}
// parinte
close(fd[1]);
write(fd[0], "ABC", 3);
...
wait(0);
verificăm că tratarea semnalelor întrerupe execuția threadului curent:
#include <signal.h>
#include <stdio.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
void testsig()
{
printf("HANDLER: TID=%ld\n", syscall(__NR_gettid));
}
int main()
{
printf("MAIN: PID=%d, TID=%ld\n", getpid(), syscall(__NR_gettid));
signal(SIGHUP, testsig);
for (;;) {sleep(2);}
}
kill -HUP <PID>
(ex. kill -HUP 1234
)signal()
, time()
+ ctime()
).fork
, pipe
, write
, read
).fork
, gets
, strstr
, strlen
).fork
+dup2
+ exec
, read
, strlen
). Comparați cu soluția alternativă ce ar folosi popen
./tmp/pb6
(mkfifo
, fopen
, unlink
).