1

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

输出bin.c

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

这是我的 input.c 的主要段落:

#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]): ./input 10 我得到以下信息:

A
AA
AAA
AAAA
AAAAA
AAAAAA
AAAAAAA
AAAAAAAA
AAAAAAAAA
AAAAAAAAAA

没关系,但直到我删除这段代码 - “ printf("%s", input); ”并取消注释“ execl ”,所以:

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

并运行:./a.out 10 ./outputbin

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

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

4

1 回答 1

0

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

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

循环只会迭代一次 -execl被调用后,outputbin将开始执行。如果你想保留循环逻辑,你应该把它移到那里,outputbin.c这样它就会在那里执行。

于 2015-02-15T19:42:23.037 回答