Mam program, który tworzy N procesów, gdzie N jest argumentem wejściowym podanym w linii poleceń. Próbowałem zwiększyć tę wartość i uzyskać fork: Resource temporarily unavailable.
Nawet przy ustawianiu odpowiednich parametrów otrzymałem takie same wyniki na tej samej wartości N.
kern.maxproc
kern.maxprocperuid
Być może istnieją inne miejsca, do których muszę się odwołać, aby wykonać więcej procesów w mojej stacji.
Wydaje się fork zwraca errno = 23 co znaczy :
#define ENFILE 23 /* Too many open files in system */
Próbowałem również zwiększyć następujące wartości, ale nie pomogło (choć wątpię, czy jest to istotne, ponieważ moje procesy są proste i nie mają dostępu do żadnego pliku)
maxflies
maxfilesperproc
Ponowne uruchomienie komputera, aby nowa konfiguracja była skuteczna, nie pomoże w tym przypadku, ponieważ zmodyfikowane parametry powracają do wartości domyślnej.
Kod źródłowy mojego programu:
void DoWorkInChild() {
sleep(10);
}
int main (int argc, char *argv[]) {
pid_t pids[100000];
int i;
int n = atoi(argv[1]);
printf("I'm grandParent %d n = %d \n", getpid(), n);
/* Start children. */
for (i = 0; i < n; ++i) {
if ((pids[i] = fork()) < 0) {
printf("errno = %x \n", errno);
perror("fork");
abort();
} else if (pids[i] == 0) {
DoWorkInChild();
exit(0);
} else {
printf("I'm process %d \n", pids[i]);
}
}
/* Wait for children to exit. */
int status;
pid_t pid;
while (n > 0) {
pid = wait(&status);
printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
--n;
}
}
N? Widziałeś Mac OS X Podpowiedź: Rozwiązanie dla limitów procesowych systemu Mac OS X. ? Czy jesteś twórcą programu tworzącego procesy?