/* *IfweclonewithCLONE_VMthenthevalueintheparentshould *beunchangedandthechildshouldstartwithzeroandbeableto *setitsownvalue.
*/ staticint write_clone_read(void)
{ int parent_tid, child_tid;
pid_t parent, waiting; int ret, status; void *stack;
parent = getpid();
set_tpidr2(parent);
stack = malloc(__STACK_SIZE); if (!stack) {
ksft_print_msg("malloc() failed\n"); return0;
}
ret = sys_clone(CLONE_VM, (unsignedlong)stack + __STACK_SIZE,
&parent_tid, 0, &child_tid); if (ret == -1) {
ksft_print_msg("clone() failed: %d\n", errno); return0;
}
if (ret == 0) { /* In child */ if (get_tpidr2() != 0) {
ksft_print_msg("TPIDR2 non-zero in child: %llx\n",
get_tpidr2()); exit(0);
}
if (gettid() == 0)
ksft_print_msg("Child TID==0\n");
set_tpidr2(gettid()); if (get_tpidr2() == gettid()) { exit(1);
} else {
ksft_print_msg("Failed to set TPIDR2 in child\n"); exit(0);
}
}
for (;;) {
waiting = waitpid(ret, &status, __WCLONE);
if (waiting < 0) { if (errno == EINTR) continue;
ksft_print_msg("waitpid() failed: %d\n", errno); return0;
} if (waiting != ret) {
ksft_print_msg("waitpid() returned wrong PID %d\n",
waiting); return0;
}
if (!WIFEXITED(status)) {
ksft_print_msg("child did not exit\n"); return0;
}
if (parent != get_tpidr2()) {
ksft_print_msg("TPIDR2 corrupted in parent\n"); return0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.