<div><br></div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Nicky Chorley <<a href="mailto:ndchorley@gmail.com">ndchorley@gmail.com</a>>于2022年8月9日 周二20:31写道:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi folks,<br>
<br>
I wrote a small program to start a new process (a shell), create a<br>
cgroup and add the process to it. This all works fine - the process ID<br>
of the shell ends up in the cgroup.procs file and when my program<br>
exits, cgroup.procs ends up empty as expected. If I try and remove the<br>
cgroup directory, though, I get a load of "Operation not permitted"<br>
errors and I'm not sure why. I'm running on openSUSE (kernel 5.3.18)<br>
with cgroups v2.<br>
<br>
My program looks like:<br>
<br>
#define _GNU_SOURCE<br>
#include <sched.h><br>
#include <signal.h><br>
#include <stdio.h><br>
#include <stdlib.h><br>
#include <sys/stat.h><br>
#include <sys/wait.h><br>
#include <unistd.h><br>
<br>
int startShell(void *argument) {<br>
    char* arguments[] = {"bash", NULL};<br>
    char* environment[] = {NULL};<br>
    execve("/bin/bash", arguments, environment);<br>
<br>
    return 0;<br>
}<br>
<br>
int main() {<br>
    mkdir(<br>
        "/sys/fs/cgroup/my_group",<br>
        S_IRWXO | S_IRGRP | S_IROTH<br>
    );<br>
<br>
    int stackSizeBytes = 65536;<br>
    char *stackStart = malloc(stackSizeBytes);<br>
    char *stackEnd = stackStart + stackSizeBytes;<br>
<br>
    pid_t childPid = clone(<br>
        startShell,<br>
        stackEnd,<br>
        SIGCHLD,<br>
        NULL<br>
    );<br>
<br>
    FILE* procsFile = fopen(<br>
        "/sys/fs/cgroup/my_group/cgroup.procs",<br>
        "w"<br>
    );<br>
<br>
    fprintf(procsFile, "%d\n", childPid);<br>
    fclose(procsFile);<br>
<br>
    waitpid(childPid, NULL, 0);<br>
<br>
    return 0;<br>
}<br>
<br>
and output looks like:<br>
<br>
$ su -c ./run<br>
Password:<br>
<br>
# echo $$<br>
4382<br>
# cat /sys/fs/cgroup/my_group/cgroup.procs<br>
4382<br>
4522<br>
# exit<br>
$ cat /sys/fs/cgroup/my_group/cgroup.procs<br>
$ su -c "rm -rf /sys/fs/cgroup/my_group"</blockquote><div dir="auto">You have to use rmdir to remove </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex" dir="auto"><br>
Password:<br>
rm: cannot remove '/sys/fs/cgroup/my_group/cgroup.events': Operation<br>
not permitted<br>
rm: cannot remove '/sys/fs/cgroup/my_group/memory.events': Operation<br>
not permitted<br>
... other lines omitted for brevity<br>
<br>
Could someone please help me understand what's going on here?<br>
<br>
Thanks!<br>
<br>
_______________________________________________<br>
Kernelnewbies mailing list<br>
<a href="mailto:Kernelnewbies@kernelnewbies.org" target="_blank">Kernelnewbies@kernelnewbies.org</a><br>
<a href="https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies" rel="noreferrer" target="_blank">https://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies</a><br>
</blockquote></div></div>