首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >父进程和子进程

父进程和子进程
EN

Stack Overflow用户
提问于 2010-03-14 04:57:09
回答 1查看 1.7K关注 0票数 3

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

我计算的参数正确吗?我一次只发送一个参数,我是在收割孩子吗?

代码语言:javascript
复制
#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);

}
EN

回答 1

Stack Overflow用户

发布于 2010-03-14 05:55:22

第二个wait()是多余的;孩子没有自己的孩子要等待。第二个“exit(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++)‘也不是一个好主意,因为这会在每次迭代中计算字符串的长度。将其替换为以下任一项:

代码语言:javascript
复制
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);

关闭未使用的管道末端-这是使事情正常工作的关键一步。

代码似乎可以正确计数。当我测试它时,它在货架上就能正常工作。为什么你怀疑它不工作?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2439996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档