2017-01-22 144 views
1

好吧我做错了什么?我在Ubuntu上这样做,我想让系统命令“ls”和一个参数如“-a”,然后让孩子执行它,然后父母只是打印出来。我不明白为什么我一直让“父母”返回两次。有任何想法吗?使用fork进行C语言编程()

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

void Cprocess(char *commands, char *scommands[]); 
void Pprocess(void); 

void main(int argc, char *argv[]) 
{ 

    char *sendcommand[] = {argv[1],argv[2],0}; 
    char *commands = argv[0]; 
    int pid; 

    if((pid=fork()) ==-1) 
    { 
      perror("Error!!\n"); 
    } 
    else if(pid==0) 
      Cprocess(commands, sendcommand); 
    else 
    { 
      wait(0); 
      printf("Parent\n"); 
    } 
} 
void Cprocess(char *argv1, char *argv2[]) 
{ 
    execvp(argv1, argv2); 
    exit(19); 
} 

这是不是很好的我这里是我输入命令:

./filename ls -a 

这里是我的结果:

filename1 filename2 filename3 
Parent 
Parent 
+0

你告诉你的孩子跑'command'这是'argv的[0]',它是当前程序。据推测,你的意思是复制'argv [1]'而不是'argv [0]'?或者,您可以不使用单独的'command'命令,只需使用'sendcommand [0]'作为'execvp()'的第一个参数。不过,我没有跟踪为什么你没有得到运行父母的许多副本。 –

+0

BTW:main()应该返回int。 – wildplasser

回答

2

恭喜:您的程序非常作品。我认为你已经使事情比他们需要插入Cprocess()函数更复杂一点;没有它,发生了什么可能会更清楚。请允许我重新安排你的程序了一下:

void main(int argc, char *argv[]) { 
    int pid = fork(); 

    if (pid ==-1) { 
     perror("Error!!\n"); 
    } else if (pid==0) { 
     char *sendcommand[] = { argv[1], argv[2], 0 }; 
     execvp(argv[0], sendcommand); 
     exit(19); 
    } else { 
     wait(0); 
     printf("Parent\n"); 
    } 
} 

这是功能上等同于原来的main(),我敢打赌,你会在里面看到了问题的时候了。

提示:

仔细的参数execvp()查找。

提示2:

的第一个参数指定execvp()程序运行。

提示3:

你是认真的?让你的大脑工作,或者至少是你的调试器。

+0

准确地添加了您的代码并进行了更改:execvp(argv [0],sendcommand); execvp(argv [1],sendcommand);它的工作。我为什么得到两个答复? P.S.就像提示一样! – shayster01

+1

程序在其参数中收到的'argv [0]'通常是程序本身的名称。如果你将它作为第一个参数传递给'execvp()',那么你告诉它运行父程序的另一个副本。还要注意,作为第二个参数传递给'execvp()'的数组需要遵循相同的约定 - 第一个元素(在索引0处)预计为某种形式的程序名;实际参数从索引1开始。 –

+0

感谢您的快速回复和解释。 – shayster01