2012-02-03 1 views
0

Хорошо, я отправляю свой код. Я объяснил, что я хочу сделать раньше. Проводя оба моих файла c, я надеюсь, что вы можете найти мою ошибку. Спасибо Это myfork.cКак добавить аргумент, когда я вызываю файл c

#include <stdio.h> 
#include <unistd.h> 
int main(int argc,char *argv[]) 
{ 
    int pid; 
    int s; 
    int waitPid; 
    int childPid; 

    pid = fork(); 
    if (pid == 0 && pid != -1) { 
    childPid = getpid(); 
    printf("Child Process ID:%d, Parent ID:%d, Process " 
      "Group:%d\n",childPid,getppid(),getgid()); 
    execl("/bin/cat","cat","-b","-t","-v",argv[1],(char*)NULL); 
    } else { 
    printf("Original Process ID:%d, Parent Is:%d, Process Group " 
      "Is:%d\n",childPid,getppid(),getgid()); 
    waitPid = waitpid(childPid,&s,0); 
    } 
    return 1; 
} 

Это test.c

#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 

int main(void){ 
    pid_t fork_return; 
    fork_return = fork(); 
    if (fork_return==0) { 
    printf("In the CHILD process\n"); 
    } else { 
    printf("In the PARENT process\n"); 
    } 
    return 0; 
} 
+0

./mywork blahblah –

+0

Хмм Я попробовал это, но это дает что-то вроде этого: Оригинальный идентификатор процесса: 0, родитель: 11875, группа процессов Является: 12024 Child Process ID: 12977, Родитель ID: 12976, Процесс Группа: 12024 и вот код файла test.c Original ID: 0 Я думаю, что я что-то делаю неправильно –

+0

И результат должен быть примерно таким: Первая информация о детском процессе, а затем индекс файла test.c и в конце, информация о родительском процессе (исходный процесс) –

ответ

1
#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

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

    if ((pid = fork()) == -1) 
    { 
     perror("fork"); 
     exit(1); 
    } 

    if (pid == 0) 
    { 
     printf("Child Process ID:%d, Parent ID:%d, Process Group:%d\n", getpid(), getppid(), getgid()); 

     execl("/bin/cat", "cat", "-b", "-t", "-v", argv[1], (char*)NULL); 
    } 
    else 
    { 
     waitPid = waitpid(pid, &s, 0); 

     printf("Original Process ID:%d, Parent (of parent) Is:%d, Process Group Is:%d\n", getpid(), getppid(), getgid()); 
    } 

    return 0; 
} 

./myfork test.c

Вы можете проверить, что execl() не неудача и т. д. Помимо некоторых незначительных ошибок, в основном у вас это было. Самое главное было поставить родителя printf() после waitpid().

+0

Спасибо, мой друг. Вы решили мою проблему. –

2

Кажется, что вы хотите распечатать информацию о родительском процессе после ожидания дочернего элемента, поэтому переместите оператор printf после waitpid. Также значение childPid в родительском процессе будет мусором. Вместо этого вы должны использовать pid. Также лучше обрабатывать -1 отдельно. Что-то на этих линиях, может быть:

pid = fork(); 
if (pid == -1) 
{ 
    perror("fork"); 
    /* Handle error*/ 
} 
else if(pid == 0){ 
    printf("Child Process ID:%d, Parent ID:%d, Process Group:%d\n",getpid(),getppid(),getgid()); 
    execl("/bin/cat","cat","-b","-t","-v",argv[1],(char*)NULL); 
    perror("execl"); /* Print the error message for execl failure*/ 
} 
else{ 
    waitPid = waitpid(pid,&s,0); /* pid holds child's pid in parent process*/ 
    printf("Original Process ID:%d, Parent Is:%d, Process Group Is:%d\n",getpid(),getppid(),getgid()); 
} 

Боковые ноты:
1. может быть лучше использовать pid_t вместо int для pid & waitPid. Вы можете избавиться от childPid.
2. Вы должны включить sys/types.h для pid_t & sys/wait.h для waitpid.
3. Обычно, когда ошибок нет main()0.
Надеюсь, это поможет!

+0

Вы правы. Спасибо. И ты, и Дак правы. –

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