使用fork()进行C系统编程

时间:2017-01-22 21:25:06

标签: c linux operating-system

好吧,我做错了什么?我在Ubuntu上这样做,我想要这个系统命令" ls"和一个参数如" -a"然后让孩子执行它,然后父母只是打印出来的东西。我无法理解为什么我一直在"父母"两次回来。有什么想法吗?

#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

1 个答案:

答案 0 :(得分: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:

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