WEXITSTATUS(childStatus) връща 0, но waitpid връща -1

Доколкото знам, ако waitpid върне -1, това е състояние на грешка. Как е възможно да се постигне успех (EXIT_SUCCUSS) от дъщерен процес в WEXITSTATUS(childStatus)?

Каква е разликата между childStatus в waitpid и върната стойност от WEXITSTATUS(childStatus)? същото ли е

pid_t returnValue = waitpid(Checksum_pid, &childStatus, WNOHANG);
printf("return value = %d", returnValue);
printf("return value = %d", childStatus);

if (WIFEXITED(childStatus))
        {
            printf("Exit Code: _ WEXITSTATUS(childStatus)") ;    
            //Proceed with other calculation.  
        }

person kapilddit    schedule 04.04.2014    source източник


Отговори (2)


Когато използвам опцията WNOHANG, бих очаквал, че повечето от времето waitpid ще върне -1, като errno е зададено на ECHILD.

Във всеки случай, когато waitpid прави връща -1, не трябва да гледате childStatus, което (доколкото знам) може да е просто боклук. Вместо това погледнете errno и се справете с него по подходящ начин.

В противен случай вашият код изглежда е добре, що се отнася до него, и трябва да можете да извлечете 0 или EXIT_SUCCESS от childStatus.

Страницата с ръководство за waitpid предлага следния примерен код:

   if (WIFEXITED(status)) {
       printf("exited, status=%d\n", WEXITSTATUS(status));
   } else if (WIFSIGNALED(status)) {
       printf("killed by signal %d\n", WTERMSIG(status));
   } else if (WIFSTOPPED(status)) {
       printf("stopped by signal %d\n", WSTOPSIG(status));
   } else if (WIFCONTINUED(status)) {
       printf("continued\n");
   }

въпреки че може да е добра идея да добавите окончателно else printf("oops?\n") изявление към това.

person Joseph Quinsey    schedule 04.04.2014
comment
Добре ли е да правите waitpid след редовен интервал, за да стане сукус? Винаги получавам -1... - person kapilddit; 07.04.2014
comment
Опитах по-горе споменатото, както предложихте. Получавам -1 върната стойност от waitpid през цялото време с errorno като ECHILD. но WIFEXITED(статус) връща 1 и WEXITSTATUS(статус) връща 0. Можете ли да ми предложите как мога да продължа в това състояние? - person kapilddit; 07.04.2014
comment
@kapilddit: Какво се случва, ако замените WNOHANG с 0? - person Joseph Quinsey; 07.04.2014
comment
Опитах с 0 (вместо WNOHANG), но все още проблемът е същият. waitpid връща -1 с грешка ECHILD. Изпълних същия код в ubuntu, той дава дете pid като върната стойност от waitpid и код за изход като 0. Не знам защо получавам различно поведение с една и съща част от кода. - person kapilddit; 07.04.2014
comment
@kapilddit: Още едно предложение: страницата на ръководството казва, че ако SIGCHLD е настроено на SIG_IGN ... тогава ... извикване на waitpid() ... ще блокира, докато всички деца не бъдат прекратени, и след това ще се провали с errno, настроено на ECHILD. - person Joseph Quinsey; 07.04.2014
comment
Инициализирам състоянието на детето с 0xFFFF и сега получавам print ascontinued. Какво означава? - person kapilddit; 10.04.2014
comment
@kapilddit: Да повторя, когато waitpid върне -1, не трябва да гледате childStatus, което (доколкото знам) може да е просто боклук - person Joseph Quinsey; 10.04.2014

WIFEXITED ще прочете всяка стойност, съхранена в childStatus, която е просто цяло число, така че не е необходимо да идва от waitpid() - опитайте напр.

for(i = 0; i < 1234; i++)
        printf("WIFEXITED(%d) %s\n", i, WIFEXITED(i) ? "yes" : "no");

Разликата между childSTatus и WIFEXITED(childStatus) е малко трудна... По принцип състоянието на изход е злоупотребено, за да се каже състоянието на изход или сигнала, който е убил процеса: бихте искали нещо като

struct exitstatus {
        int status;
        int signalnumber;
        enum { exited, signaled };
};

но тази информация е била събрана в едно цяло число по някакъв начин (не съм сигурен дали точните подробности са дефинирани някъде): например на моя компютър младите 8 бита се използват за номера на сигнала (ако има такъв), а битовете 8 -15 се използват за код за изход. Важният момент навсякъде е, че не е нужно да знаете как се случва, а само как да получите желаните резултати чрез WIFEXITED и приятели.

person loreb    schedule 04.04.2014
comment
В какъв случай ще получа -1 върната стойност от waitpid? Получавам ECHILD като errono/код на грешка. В waitpid трябва ли да предам childpid, за който искам да знам състоянието? Само в родителския процес мога да поискам състоянието на дете или в друг процес също мога да поискам състоянието на конкретния pid? - person kapilddit; 04.04.2014
comment
Справката за waitpid е на pubs.opengroup.org/onlinepubs/9699919799/functions/ waitpid.html; waitpid може да прави и двете неща, т.е. да чака всеки процес/конкретен процес; да, само в родителския процес (освен ако не броите повторно родителство) - person loreb; 04.04.2014