Вы не указали, на каком языке вы разрабатываете, но поскольку вы упомянули system()
, я предполагаю, что вы имеете в виду C или C ++.
Как правило, это достигается с помощью fcntl () для установки флага close-on-exec для тех файловых дескрипторов, которые вы не хотите наследовать:
int fd = open("somefile", O_RDONLY);
fcntl(fd, F_SETFD, FD_CLOEXEC);
Вы также можете сделать это методом грубой силы, просматривая все возможные fd в дочернем процессе после разветвления, но перед выполнением. Это немного сложнее, потому что это требует, чтобы вы знали, каково максимально возможное значение fd, и это также менее эффективно, потому что в конечном итоге вы будете повторять и «закрывать» кучу неиспользованных fd. Примерно так:
pid_t pid = fork();
switch (pid) {
case 0:
// In the child process. Iterate through all possible file descriptors
// and explicitly close them.
long maxfd = sysconf(OPEN_MAX);
for (long i = 0; i < maxfd; ++i) {
close(i);
}
// Now exec the new program, file-handle free.
execlp("someprogram", "arg1", "arg2");
break;
case -1:
// TODO: handle errors.
break;
default:
// Parent process.
int status;
pid_t finished = waitpid(pid, &status, 0);
break;
}
Надеюсь, это поможет,
Эрик Мелски