C - fork()& execl()&循环+"半金字塔输出"

时间:2015-02-15 19:29:39

标签: c loops fork execl

我遇到以下问题。比方说,我有两个程序,一个是“input.c”,第二个是“output.c”。输出很简单,看起来像这样(我只会粘贴最重要的段落)。

outputbin.c

//
char buffer[512];
strncpy(buffer, argv[1], sizeof(buffer));
printf("Your output is: %s\n", buffer);
//

这是我输入的主要段落:

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

int main(int argc, char *argv[])
{
    pid_t pid;
    char *charchar = "\x41";
    int status;
    char *outputbin;
    int i, j, iterations;

    if(argc < 2)
    {
        fprintf(stderr, "Usage: %s <iterations> <outputbin>\n", argv[0]);
        exit(0);
    }

    iterations = atoi(argv[1]);
    outputbin = argv[2];

    pid = fork();

    if(pid != 0)
    {       
        waitpid(-1, &status, 0);
    }

    if(pid == 0)
    {
        for(i=0; i < iterations; ++i)
        {
            for(j = 0; j <= i; ++j)
            {   
                printf("%s", charchar);                         
                //execl(outputbin, outputbin, charchar, NULL);              
            }
            printf("\n");
        }
    }
    return 0;
}

当我使用gcc编译这个程序并执行此操作时(不使用argv [2]): ./输入10 我明白了:

A
AA
AAA
AAAA
AAAAA
AAAAAA
AAAAAAA
AAAAAAAA
AAAAAAAAA
AAAAAAAAAA

没关系,但只有在我删除这段代码之后 - “ printf(”%s“,输入); ”并取消注释“ execl ”,所以:

for(j = 0; j <= i; ++j)
                {                                                   
                    execl(output, output, input, NULL);             
                }

然后运行: ./ a.out 10 ./outputbin

我只得到这个 - 你的输出是:A

只有第一个字符,而这就是全部。如何让逐行执行整个“半金字塔”的字符串?无论我尝试什么,一切都以相同的结果结束。

1 个答案:

答案 0 :(得分:0)

假设它成功执行,execl 不返回 - 它用另一个程序替换在该过程中运行的程序。所以在致电时:

for(j = 0; j <= i; ++j)
{                                                   
    execl(output, output, input, NULL);             
}

循环只会迭代一次 - 在调用execl后,outputbin将开始执行。如果你想保持循环逻辑,你应该将它移动到outputbin.c,以便它在那里执行。