как правильно использовать fork () и exec ()

У меня есть этот код;

pid_t process; process = fork(); if (process < 0){ //fork error perror("fork"); exit(EXIT_FAILURE); } if (process == 0){ //i try here the execl execl ("process.c", "process" , n, NULL); } else { wait(NULL); } 

Я не знаю, правильно ли используется использование fork() и exec() . Когда я пытаюсь запустить программу из bash, я не получаю никакого результата, поэтому я подумал, что это может быть проблемой в этой части кода.
Благодарю.

Одна из проблем заключается в том, что

 if (process = 0){ 

должен прочесть

 if (process == 0){ 

В противном случае вы назначаете нуль для process и вызываете только execl если result не равен нулю (т.е. никогда).

Кроме того, вы пытаетесь выполнить что-то, называемое process.c . Нет сомнений в том, что можно иметь исполняемый файл, называемый process.c . Однако условно имена, заканчивающиеся на .c , передаются в файлы исходного кода C. Если process.c действительно является C-файлом, вам необходимо сначала его скомпилировать и связать.

После того, как вы создали исполняемый файл, вам нужно либо разместить его где-нибудь на $PATH либо указать его полный путь к execle() . Во многих средах Unix размещение его в текущем каталоге будет недостаточным.

Наконец, непонятно, что n находится в execle() , но имя указывает на числовую переменную. Вы должны убедиться, что это строка, а не, например, целое число.

В соответствии с ответами и комментариями выше ваш код должен выглядеть примерно так:

 pid_t process; process = vfork(); //if your sole aim lies in creating a child that will ultimately call exec family functions then its advisable to use vfork if (process < 0) { //fork error perror("fork"); exit(EXIT_FAILURE); } if (process == 0) { //i try here the execl char N[MAX_DIGITS];//A correction here itoa(n,N);//write this function yourself execl ("process", "process" , N, NULL);// Here process is the name of the executable N is your original argument fprintf(stderr,"execl failed\n");//check for error in execl } else { wait(NULL); } 

Обратите внимание на использование vfork вместо fork.Its, потому что это будет намного более эффективно. Причина может быть найдена здесь