2015-04-04 6 views
0

Я пытаюсь выполнить программу с некоторыми аргументами с помощью c-программы. Но, похоже, это не работает. Вот код в C:c execute не работает

#include<stdio.h> 
#include<unistd.h> 

int main(int argc, char *argv[]) 
{ 
    int i; 
     for (i = 0; i < 10; i++) 
     { 
       execl("tempo2","-gr fake","-f best.sim.par","-ndobs 30","-nobsd 1","-ha 12","-randha y","-start 57023","-end 60000","-rms 0.0012",NULL); 
     } 
    return 0; 
} 

компилировать с GCC на монетном дворе 17. Когда я бегу, что с-программа ничего не происходит. В Баше он работает и выглядит следующим образом:

#!/bin/bash 

for i in `seq 1 10`; 
do 
    tempo2 -gr fake -f best.sim.par -ndobs 30 -nobsd 1 -ha 12 -randha y -start 57023 -end 60000 -rms 0.0012 
done 

Может кто-нибудь перевести мне код Баша в с или сказать, что я сделал не так? Спасибо и счастливого ПРАЗДНИКАМ ПАСХА

+0

любая причина не использовать сценарий bash? –

ответ

2

вы можете использовать систему() функцию вместо execl() из командной оболочки

system("tempo2 -gr fake -f best.sim.par -ndobs 30 -nobsd 1 -ha 12 -randha y -start 57023 -end 60000 -rms 0.0012"); 
+0

хорошо, это работает спасибо. Мне нужно запустить программу tempo2 в цикле 10000 раз. Это занимает около 6 часов. Я могу запустить его с помощью bash или c, что бы сократилось. Q: есть ли способ c для ускорения процесса? – feeling

+0

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

1

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

Возвращаемое значение равно -1, а errno устанавливается для указания ошибки.

У меня нет вашей программы, но вам нужно указать полный путь к «tempo2», или вы получите errno 2 => нет такого файла или каталога.

1

Первый аргумент execl - это путь к программе для запуска. Второй аргумент - это значение, которое появляется в этой программе argv[0] и часто совпадает. Таким образом, вы должны положить "tempo2"дважды в список аргументов. Кроме того, каждое разделенное пробелом слово в командной строке должно быть в отдельной строке. Поэтому вместо "-gr fake" вы должны использовать "-gr","fake".

Все сказали, ваш execl вызов должен выглядеть следующим образом:

execl("tempo2","tempo2","-gr","fake","-f","best.sim.par","-ndobs","30","-nobsd","1","-ha","12","-randha","y","-start","57023","-end","60000","-rms","0.0012",NULL); 

Наконец, одна важная вещь, о execl. Он заменяет текущий процесс с новой программой. Таким образом, хотя он находится в цикле, tempo2 будет запущен только . Чтобы сделать то, что вы пытаетесь сделать, вам нужно использовать fork, чтобы создать дочерний процесс для запуска каждого execl.

Все сказано, что вам, вероятно, лучше использовать system в качестве предлагаемого @SunDro.

+0

хорошо, спасибо за это объяснение – feeling

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