父进程和子进程

时间:2010-03-13 20:57:09

标签: c

我正在尝试编写一个程序,父进程将获取main()的参数,并通过管道(每个字符一次写入一次调用)一次一个地将字符发送到子进程。子进程将计算父进程发送给它的字符,并打印出从父进程收到的字符数。子进程不应以任何方式使用main()的参数。孩子应该正常返回而不让父母杀死孩子。

我认为这些论点是正确的吗?我一次发送一个论点,我是在收养孩子吗?

#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define size = 100;

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

    int i, count =0;
    int c;

    int     fdest[2];          // for pipe
    pid_t   pid;              //process IDs
    char    buffer[BUFSIZ];



    if (pipe(fdest) < 0)          /* attempt to create pipe */
        perror( "pipe" );

    if ((pid = fork()) < 0)  /* attempt to create child / parent process */

    {
        perror( "fork" );
    } 


    /* parent process */
    else if (pid > 0) { 

        close(fdest[0]);
        for (i=1; i < argc; ++i) 
        {
            for (c=0; c < strlen(argv[i]); ++c) {
                write(fdest[1], &argv[i][c], 1);
            }
        }

        close(fdest[1]);         
        wait(NULL);             
        exit(0);

    } else {   

        /* child Process */
        close(fdest[1]);

        while (read(fdest[0], &buffer, 1) > 0)
        {
            count++;
        }


        printf("\nchild: counted %d characters\n", count);

    }
    wait(NULL);
    exit(0);

}

1 个答案:

答案 0 :(得分:2)

第二次等待()是多余的;孩子没有自己的孩子等待。第二个'退出(0);'可以用'return(0);'代替。您可以省略之前的'exit(0);'太

'#define size = 100;'未被使用,这也是因为'='使其无法用于大多数目的(并且分号也是一个坏主意 - 很少有宏结束半-结肠)。它应为“#define size 100”或“enum { size = 100 };”。通常,人们使用大写名称作为“清单常量”,因此使用“enum { SIZE = 100 };

如果您一次只读一个字符,则实际上不需要BUFSIZ大小的缓冲区(通常为512或更大)。

此外,执行'for (c = 0; c < strlen(argv[c]); c++)'是一个坏主意,因为它会计算每次迭代时字符串的长度。替换为以下任何一个:

for (const char *str = argv[i]; *str != '\0'; str++)
    write(fdest, str, 1);

for (c = 0, len = strlen(argv[i]); c < len; c++)
      write(fdest[1], &argv[i][c], 1);

关闭管道的未使用端 - 这是使工作正常的关键步骤。

代码似乎正在计数。当我测试时,它可以下架。为什么你怀疑它不起作用?