Files
KirkOS/user/include/mlibc/tests/linux/pidfd.c
T
kaguya 9a9b91c940 user: implement mlibc as the libc, finally.
It's finally done..

Signed-off-by: kaguya <vpshinomiya@protonmail.com>
2026-05-02 03:31:49 -04:00

75 lines
1.3 KiB
C

#include <assert.h>
#include <errno.h>
#include <poll.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/pidfd.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
int child = fork();
if(!child) {
sleep(1);
exit(42);
}
int pidfd = pidfd_open(child, 0);
assert(pidfd > 0);
int ret = lseek(pidfd, 0, SEEK_SET);
assert(ret == -1);
assert(errno == ESPIPE);
pid_t outpid = pidfd_getpid(pidfd);
assert(outpid == child);
struct pollfd pollfd;
pollfd.fd = pidfd;
pollfd.events = POLLIN;
int ready = poll(&pollfd, 1, 0);
assert(ready == 0);
ready = poll(&pollfd, 1, 2000);
if(ready == -1) {
perror("poll");
exit(EXIT_FAILURE);
}
assert(ready == 1);
assert(pollfd.revents == POLLIN);
siginfo_t info = {};
ret = waitid(P_PIDFD, pidfd, &info, WEXITED | WNOHANG);
assert(ret == 0);
assert(info.si_code == CLD_EXITED);
assert(info.si_pid == child);
assert(info.si_status == 42);
close(pidfd);
child = fork();
if(!child) {
sleep(10);
}
pidfd = pidfd_open(child, 0);
assert(pidfd > 0);
ret = pidfd_send_signal(pidfd, SIGKILL, NULL, 0);
assert(ret == 0);
memset(&info, 0, sizeof(info));
ret = waitid(P_PIDFD, pidfd, &info, WEXITED);
assert(ret == 0);
assert(info.si_code == CLD_KILLED);
assert(info.si_pid == child);
assert(info.si_status == SIGKILL);
return 0;
}