возвращаемое значение из дочернего процесса c

Мне нужна помощь в возврате «кода состояния» из моей дочерней программы обратно в родительскую, где она проверит код состояния, напечатает код и выйдет из родительской. Это для классного проекта, поэтому я поместил здесь соответствующий код, но не буду публиковать весь проект по очевидным причинам.

Я разветвил и создал дочерний процесс через exec. Родительский процесс выполняет некоторые сложные вычисления и использует именованный канал для передачи данных дочернему процессу. Ребенок занимается более сложной математикой. Когда я использую ключевое слово, дочерний элемент должен вернуть родителю количество раз, которое он выполнил причудливую математику на своем конце, где родитель увидит это, распечатает возвращенное число и выйдет из родителя.

    int status;
    pid_t child_id;
    child_id = fork();
    if (child_id == 0)
    {
            // put child code here
            exec(opens second process);
    }
     if (child_id < 0)
    {
            perror("fork failed\n");
            exit(EXIT_FAILURE);
    }

     while(child_id != 0)
     {
       //parent process
       //do fancy math stuff here
       // pipe
      //open pipe
      //converted math to "string" to pass to other program
      // use fprintf to send data to other program
      fprintf(fp,"%s",str);
      //close pipe
//**************************************************
//this block doesn't work, always returns 0
      if (WIFEXITED(status)){
            int returned = WEXITSTATUS(status);
            printf("exited normally with status %d\n",returned);
      }
//***************************************************
   return 0;

Вторая программа на языке C представляет собой простое чтение конвейера, выполняет более сложные математические операции и имеет операторы возврата, размещенные там, где я хочу вернуть число.

Насколько я понимаю, есть способ передать возвращаемое значение из дочерней программы, но я не могу понять, как это сделать. Я добавил кусок кода, который я нашел, но я не могу заставить его работать. Я читал об этом, но, может быть, я что-то упустил?

пожалуйста, не обращайте внимания на любые проблемы с синтаксисом или структурой.


person user7904063    schedule 22.04.2017    source источник
comment
после вызова exec() вставьте следующие две строки: perror( "exec failed" )l exit( EXIT_FAILURE ); для «редкого» случая, когда вызов exec() не удался   -  person user3629249    schedule 23.04.2017


Ответы (1)


Вы пытаетесь прочитать status через функцию WIFEXITED, но никогда не присваиваете ей значение. Попытка прочитать неинициализированное значение вызывает неопределенное поведение.

Вам нужно вызвать функцию wait, которая говорит родителю дождаться завершения дочернего процесса и получить его код возврата:

wait(&status);
if (WIFEXITED(status)){
      int returned = WEXITSTATUS(status);
      printf("exited normally with status %d\n",returned);
}
person dbush    schedule 22.04.2017
comment
@ user7904063 Рад, что смог помочь. Не стесняйтесь принять этот ответ, если он показался вам полезным. - person dbush; 23.04.2017