Я создал несколько дочерних процессов fork() и запустил их исполняемый файл execl().Как проверить успешность execl() (несколько процессов)
Я хочу проверить, нет ли какого-либо execl(), который не работает (например: попробуйте выполнить файл, не существующий). Попробуйте выполнить execl() все программы, и если один из них потерпит неудачу, верните 1 до начала связи с любыми программами.
здесь код ссылки, (предположим, что все регулировками правильны)
#DEFINE NUMBEROFCHILD 4
char** exeFile = {"./p1", "./p2", "./p3", "nonexist"); //"nonexist" is a non-exist program
int main(int argc, char** argv){
pid_t childPID [numberOfChild];
for (int i = 0; i<numberOfChild; i++) {
//setting up pipes
pid_t childPID[i] = fork();
if(childPID[i] < 0) {
//close all pipes and quit
}else if (childPID[i] == 0) {
//redirect pipe
execl(exeFile[i],"args",(char*)0;
return 1;
//I'm expecting this to return when it try to execute "nonexist"
//but it didn't and keep running successed execl()
}else {
//close un-use pipes
}
}
while(true) {
for (int i = 0; i<numberOfChild; i++) {
//communicate with childs through pipe
}
}
for (int i = 0; i<numberOfChild; i++) {
//close reminded pipes
if (waitpid(childPID[i], NULL, 0) == -1){
return 1;
}
}
return 0;
}
Эта программа еще послал сообщение «nonexist» (но ничего не получить обратно от него, как ожидают).
Возможно, когда-либо достигли моей цели? Спасибо!
Поместите 'printf' перед' return 1', чтобы увидеть, что 'execl' не удалось. Имейте в виду, что в данный момент вы находитесь в дочернем процессе, поэтому вам нужно будет использовать каналы для связи с родителем или отправить сигнал типа 'kill (getppid(), SIG_USER1)' или использовать любые количество других межпроцессных средств связи. – user3386109
Семейство функций 'exec *' возвращается к ошибке -1, а 'errno' задается для указания ошибки. Проверьте возвращаемое значение 'execl' (в основном' execl' будет возвращаться только при ошибке). – Pablo
Когда исполняемый файл не найден, 'execl' вернет 2 (' ENOENT') – Pablo