2015-02-03 4 views
0

Я написал программу для использования execl, и я хочу иметь ту же функциональность, но вместо этого используйте execv.using execv вместо execl в linux

вот моя программа от execl:

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

int main (int argc, char *argv[]) 
{ 
    int pid, status,waitPid, childPid; 

    pid = fork();/Duplicate/
    if (pid == 0 && pid != -1)/Branch based on return value from fork()/
    { 
     childPid = getpid(); 
     printf ("(The Child)\nProcess ID: %d, Parent process ID: %d, Process Group ID: %d\n",childPid,getppid(),getgid()); 
     execl("/bin/cat","cat","-b","-t","-v",argv[1],(char*)NULL); 
    } 
    else 
    { 
    printf ("(The Parent)\nProcess ID: %d, The Parent Process ID: %d, Process Group ID: %d\n",getpid(),getppid(),getgid()); 
    waitPid = wait(childPid,&status,0);/Wait for PID 0 (child) to finish ./
    } 
    return 1; 
} 

Затем я попытался изменить его, как, например, чтобы использовать execv вместо этого, но я не мог заставить его работать (так как в нем не было бы сказать, нет такого файла или каталог найдено)

Вы вызываете программу с ./ProgramName testfile.txt

Вот мои попытки в execv:

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

int main() 
{ 
    int pid, status,waitPid, childPid; 
    char *cmd_str = "cat/bin"; 
    char *argv[] = {cmd_str, "cat","-b","-t","-v", NULL }; 
    pid = fork();/Duplicate/
    if (pid == 0 && pid != -1)/Branch based on return value from fork()/
    { 
     childPid = getpid(); 
     printf ("(The Child)\nProcess ID: %d, Parent process ID: %d, Process Group ID: %d\n",childPid,getppid(),getgid()); 
     execv(cmd_str,argv); 
    } 
    else 
    { 
    printf ("(The Parent)\nProcess ID: %d, The Parent Process ID: %d, Process Group ID: %d\n",getpid(),getppid(),getgid()); 
    waitPid = wait(childPid,&status,0);/Wait for PID 0 (child) to finish ./
    } 
    return 1; 
} 

Любая помощь была бы огромной, застрявшей на этом довольно долгое время. Благодаря!

+3

'кошки/bin' не является'/bin/cat' или '/ USR/бен/cat'. Откуда вы его взяли? –

+0

Кроме того, если вы помещаете 'cmd_str' в верхнюю часть вашего списка argv, вы, вероятно, не должны _also_ иметь голый« кот »в этом списке. –

+0

Ну, первый код был предоставлен мне, я верю, что это потому, что кошка находится внутри папки bin. Первый код отлично работает при его запуске. когда я пытаюсь использовать bin/cat на 2-й, он вообще не работает. – Lain

ответ

4

У вас есть несколько ошибок в коде, который я отметил вниз:

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

int main(int argc, char *argv[])  // <-- missing argc/argv 
{ 
    int pid, status,waitPid, childPid; 
    char *cmd_str = "/bin/cat";  // <-- copy/pasta error 
    char *args[] = { "cat", "-b", "-t", "-v", argv[1], NULL }; // <-- renamed to args and added argv[1] 
    pid = fork(); // Duplicate/
    if (pid == 0) // Branch based on return value from fork()/
    { 
     childPid = getpid(); 
     printf ("(The Child)\nProcess ID: %d, Parent process ID: %d, Process Group ID: %d\n",childPid,getppid(),getgid()); 
     execv(cmd_str,args);   // <-- renamed to args 
    } 
    else 
    { 
     printf ("(The Parent)\nProcess ID: %d, The Parent Process ID: %d, Process Group ID: %d\n",getpid(),getppid(),getgid()); 
     waitPid = wait(childPid,&status,0); // Wait for PID 0 (child) to finish ./
    } 
    return 1; 
} 
+0

Пробовал это после прочтения комментария Чарлза. Это делает так, что когда я запускаю программу, она ждет ввода после выполнения строк печати для pid (так как в нем не отображается информация о файле) – Lain

+0

Plus Uno. Ты подтолкнул меня на это. Остается только проблема: 'argc' должен быть проверен, чтобы убедиться, что' argv [1] 'действительно действителен. – user3386109

+0

@ user3386109, может ли он когда-либо иметь недопустимое значение, отличное от NUL? Если бы мы взяли 'argv [2]', это было бы более рискованным. –

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