gpt4 book ai didi

c - 将命令行参数传递给子进程并计算它们

转载 作者:太空狗 更新时间:2023-10-29 15:34:04 26 4
gpt4 key购买 nike

我希望父进程将参数传递给 main() 并通过以 argv[1] 开头的管道一次一个地将其中的字符发送给子进程,然后继续处理其余参数。(一个调用为每个字符写)。

我希望子进程计算父进程发送给它的字符数,并打印出它从父进程接收到的字符数。子进程不应以任何方式使用 main() 的参数。

我做错了什么?我需要使用 exec() 吗?

不正确的输出:

    ~ $ gc a03
gcc -Wall -g a03.c -o a03
~ $ ./a03 abcd ef ghi

child: counted 12 characters
~ $

这是程序..

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

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

int length = 0;
int i, count;

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



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

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

{
printf("fork error");
}


/* parent process */
else if (pid > 0) {
close(fdest[0]);

for(i = 1; i < argc; i++) /* write to pipe */
{
write(fdest[1], argv[i], strlen(argv[1]));
}

wait(0);

} else {

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

for(i = 0; i < argc; i++)
{
length +=( strlen(argv[i])); /* get length of arguments */
}

count = read(fdest[0], buffer, length);
printf("\nchild: counted %d characters\n", count);

}

exit(0);

}

最佳答案

您说过“子进程不应该以任何方式使用 main() 的参数”。但是,我看到您的子进程正在使用 argc .这不是破坏了你的限制吗?

您还说您想要“为每个字符编写一个调用”。您当前的实现使用一次调用来为每个参数而不是每个字符编写。这是一个错字吗?如果没有,您将想要使用更像这样的东西:

char nul='\0', endl='\n';
for (a=1; a < argc; ++a) {
for (c=0; c < strlen(argv[a]); ++c) {
write(fdest[1], &argv[a][c], 1);
}
write(fdest[1], &nul, 1);
}
write(fdest[1], &endl, 1);

这将一次写入一个字符,每个参数都是一个以 NULL 结尾的字符串,最后是一个换行符。换行符仅用作指示没有更多数据要发送的标记(并且可以安全使用,因为您不会在 CLI 参数中传递换行符)。

子进程只需要是一个循环,一个一个地读取传入的字节,如果字节不是'\0',则增加一个计数器。或 '\n' .当它读取换行符时,它会跳出输入处理循环并报告计数器的值。

关于c - 将命令行参数传递给子进程并计算它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2390868/

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