#c #fork #execl
#c #форк #execl
Вопрос:
Я пытался создать двух дочерних элементов для одного родительского процесса с помощью fork (), затем запустил две «разные» команды для этих двух дочерних элементов. Я пытаюсь выполнить пинг двух разных веб-сайтов с помощью этих дочерних процессов. Дело в том, что при выполнении первой команды ping ‘она не завершается, я попытался решить это, передав -c amount, чтобы ограничить количество выходных данных, но по какой-то причине это не выполняет задание. Вот код:
pid = fork();
if(pid!=0) {
wait(amp;status);
printf("----------------------------------------------------nn");
printf ( " I am the parent my PID is %d, myPPID is %d, n ",getpid(),getppid());
printf("---------------------------------------------------nn");
}else {
printf ( " I am the child , my PID is %d , my PPID is %d n",getpid(),getppid());
printf("---------------------------------------------------nn");
execl ( "/bin/ping","-c5", "sheffield.ac.uk",(char*)0);
return 0;
if(pid!=0){
printf ( " I am the child , my PID is %d , my PPID is %d n",getpid(),getppid());
printf("---------------------------------------------------nn");
}else {
printf ( " I am the child , my PID is %d , my PPID is %d n",getpid(),getppid());
printf("---------------------------------------------------nn");
sleep(2);
execl ( "/bin/ping","-c5", "shu.ac.uk",(char*)0);
return 0;
}
}
break;
Комментарии:
1. Вы могли бы проверить это, вызвав программу (которую вы можете написать), которая печатает параметры командной строки, чтобы увидеть, что передается программе через
execl
. Знаете ли вы, чтоargv[0]
обычно хранится имя команды?2. На самом деле я не знал об этом, но спасибо, что это ответило на мой вопрос!
3.
execl()
никогда не возвращает, как таковой, если нет ошибки. Он заменяет запущенный процесс новым. Если вы хотите двух дочерних элементов, сделайте дваfork()
s. Похоже, что в вашем коде отсутствует}
послеreturn 0;
. Вы можете поместить туда вторую вилку. В качестве альтернативы,system()
возвращает, и в этом случае вам не нужно форкать, если вы не хотите, чтобы они выполнялись асинхронно. Второй pid-тест (if(pid!=0){
кажется неправильным — почему это дочерний параметр?4. Создание двух форков создает 4 процесса, не так ли? Я ищу двух дочерних элементов с одним родителем
5. дважды разветвляется в parent => parent 2 дочерних элемента. Вам нужно было бы переместить
wait
в конец, чтобы заставить их работать вместе
Ответ №1:
Из документации execl :
Первый аргумент, по соглашению, должен указывать на имя файла, связанного с выполняемым файлом.
итак, вам нужно заменить
execl ( "/bin/ping","-c5", "sheffield.ac.uk",(char*)0);
например,
execl ( "/bin/ping", "ping", "-c5", "sheffield.ac.uk",(char*)0);
Поскольку вы не указываете имя файла в качестве первого аргумента, оно заменяется на «-c5», и вы выполняете ping без этой опции
Обратите внимание также на документацию :
Возвращаемое значение
Функции exec() возвращаются только в том случае, если произошла ошибка. Возвращаемое значение равно -1, а значение errno установлено для обозначения ошибки.
Обратите внимание, что вы можете использовать popen для выполнения вашего ping, а также для получения выходных сообщений, которые он выдает