2014-02-21 5 views
2
//code for foo (run executable as ./a.out) 
#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <unistd.h> 
#include <sys/wait.h> 

int main (int argc, char **argv) { 
pid_t pid; 
pid = fork(); 
int i = 1; 
char *parms[] = {"test2", "5", NULL}; //test executable named test2 
if(pid < 0) { 
     fprintf(stderr, "Fork failed"); 
     return 1; 
} 
else if(pid == 0) { 
     printf("Child pid is %d\n", pid); 
     i = execv("test2", parms); //exec call to test with a param of 5 
} 
else { 
     wait(NULL); 
} 
printf("I is now %d\n", i); //i is still 1 here, why? 
return 0; 
} 

Привет всем, Я пытаюсь узнать немного о вызовах fork и execv(). Я делаю свою программу foo.c выше, чтобы позвонить в файл, который я назвал test.c. Я развил дочерний элемент и попросил ребенка вызвать execv, который просто добавит 10 к считываемому параметру. Я не уверен, почему переменная не изменяется в нижней части моей функции foo.c. Должен ли вызов быть указателем или возвращать адрес? Любая помощь будет принята с благодарностью. БлагодаряЗахват возвращаемого значения от execv()

Код для test.c (исполняемый названный test2)

#include <stdio.h> 

int main(int argc, char ** argv[]) { 
     int i = atoi(argv[1]); 
     i = i +10; 
     printf("I in test is %d\n", i); 
     return i; 
} 
+1

Если вы хотите, чтобы захватить возвращаемое значение из дочернего процесса, можно использовать метод IPC (трубная розетка и т. д.) или даже пытаться обмениваться данными, записывая и просматривая файлы. – YaleCheung

+0

У меня была такая же идея с файлом, что и хахаха, это мой ответ, чтобы обменять данные :) – wheatfairies

ответ

3

Вы только позвоните execv() в дочернем процессе. Семейные функции exec() никогда не возвращаются, если они успешно выполняются. См. evec(3):

Функции exec() возвращаются только в случае возникновения ошибки. Возвращаемое значение: -1, а errno - указывает на ошибку.

В родительском процессе вы напечатали значение i, оно никогда не менялось в родительском процессе.


Чтобы получить статус выхода из дочернего процесса, вы можете использовать wait() или waitpid():

else { 
     int waitstatus; 
     wait(&waitstatus); 
     i = WEXITSTATUS(waitstatus); 
} 
+0

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

+0

@wheatfairies См. Обновление. –

+0

Это сработало! Спасибо! Я думал, что WEXITSTATUS вернет только 1 или 0, исходя из того, вышел ли он или нет, но я ошибся. – wheatfairies

Смежные вопросы