gpt4 book ai didi

c - 父进程和子进程

转载 作者:行者123 更新时间:2023-12-02 02:34:28 26 4
gpt4 key购买 nike

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

我计算的参数对吗?我是不是一次一个地发送参数,我是在收割 child 吗?

#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);

}

最佳答案

第二个 wait() 是多余的; child 没有自己的 child 可以等待。第二个“退出(0);”可以替换为“return(0);”。您可以省略前面的“exit(0);”也是。

' #define size = 100; ' 未使用,这也很好,因为 '=' 使其无法用于大多数目的(分号也是一个坏主意 - 宏很少以分号结尾)。它应该是'#define size 100 ' 或 ' enum { size = 100 }; '.通常,人们对“ list 常量”使用大写名称,因此“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);

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

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

关于c - 父进程和子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2439996/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com