2015-05-06 4 views
1

У меня есть программа C, xyz.c, которая выполняет некоторые вычисления по определенной переменной, скажем transferme. Я хочу передать эту переменную/передать эту переменную в другую программу C, скажем jkl.c.Как отправить переменную между двумя программами C

Я пытался сделать следующее:

Вилка в xyz.c и использовать execvp() передать этот transferme к исполняемому jkl.c [Оказывается execvp будет принимать только пути в двоичный исполняемый файл или сценарий оболочки.]

Происходящее,

  1. execvp() не передает переменным, то нужно указать тип аргумента const char *.
  2. Передача пути к двоичному исполняемому файлу не работает. [Я попытался простой Разветвляющихся и execvp, не пытаясь передать переменную.]

Может кто-нибудь пожалуйста:

  1. Скажите, как использовать execvp() здесь, в этом случае? где двоичный исполняемый файл находится в домашней папке, скажем, что путь равен /home/user/jkl.o
  2. Скажите, как передать эту переменную в другую программу?

Я пробовал посмотреть на pipe, но я стал более смущенным.

EDIT: Я имел в виду jkl.out

+1

'хуг. c' и 'jkl.c' не являются программами, они являются файлами _source_ – Eregrith

+1

Просто убедитесь, что' jkl.c' просто другой файл исходного кода или исполняемый файл? – user1978011

+1

У каждого из них есть функция 'main'? – Eregrith

ответ

0

Вы Serveral способы передачи данных в другую программу. (pipin ', файлы и т. д. Я могу позже отредактировать свой ответ и дать более стандартное руководство по отправке данных между двумя программами C, если это необходимо) Давайте посмотрим execl() на ваш случай.

Прежде всего мы должны согласиться с тем, что программа jkl.o будет запущена вашей основной программой и получит в качестве начального параметра строку, содержащую аргумент.

Давайте посмотрим на человека execl():

Конст символ * арг и последующих эллипсов в execl(), функций имеют(), и execle() функции можно рассматривать как arg0 , arg1, ..., argn. Вместе они описывают список одного или нескольких указателей на строки с нулевым символом, которые представляют список аргументов, доступных для выполненной программы. Первый аргумент, по соглашению, должен указывать на имя файла, связанное с исполняемым файлом. Список аргументов должен быть прерван указателем NULL, и поскольку это переменные функции , этот указатель должен быть отличен (char *) NULL.

OK. Поэтому вам сначала нужно предоставить execl() ваш путь, а затем в каждой строке аргумент. Вы указали, что вам нужно развиваться, это правда.Итак, давайте сделаем это, мы вилка, а затем мы отправим строку, содержащую вашу передачу. Я предполагаю, что эта переменная является обычной строкой.

child_pid = fork() 
/* fork() == 0 for child process */ 

    if(child_pid == 0) 
    { 
     /*executing jkl.o */ 
     execl("/home/user/a.out", "a.out" , transferme); /* with a.out being your second program, you can change that to whatever you'd want*/ 
    } 
/* parent stuff*/ 

Это должно сделать трюк.


[обновление от комментариев:]

Я забыл, что argv[0] (т.е. второй аргумент execl должно быть название самой программы.), Поэтому попробуйте

execl("/home/user/d.out", "d.out", transferme, (char*) NULL); 
+0

Как 'execl' собирается выполнить объектный файл, у которого нет' __start() '? – Eregrith

+1

@Eregrith Да, я просто подумал, не знаю, я отредактировал свой ответ на свою вторую программу прямо сейчас, спасибо за головы – Mekap

+0

@Mekap Хорошо, так что работает! Еще один вопрос. Где я могу получить «transferme»? Я печатаю argv [1] в основном в jkl.c, но печатается только «null». Heres's my execl() call: 'execl ("/home/user/d.out ", transferme, (char *) NULL);' – complextea