【问题标题】:C exec, awk, not workingC exec,awk,不工作
【发布时间】:2013-04-07 11:00:21
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define MAXLINE 512
main(int argc,char* argv[]){
    int k;
    for (k=0; k<=argc; k++) {
        if (k%2==0) {
            if (fork()==0){

    FILE *fi;
    FILE *fo;
    int i;
    fi=fopen(argv[k], "r");
    fo=fopen("temp.txt","w");
    if (!fi)
        return;
    char linie[MAXLINE],*p;
    for ( ; ; ) {
        p = fgets(linie, MAXLINE, fi);
        if (p == NULL)
            break;
        linie[MAXLINE-1] = '\0';
        int k=-1;
        for (i = 0; i <MAXLINE; i++) {
            if (linie[i]=='\n') k=i;
        }
        for (i = k; i >= 0; --i) {
            fprintf(fo,"%c", linie[i]);
        }
    }
    fclose(fi);
    fclose(fo);
                exit(1);}
        }
else
{
    if (fork()==0){
        execl("/usr/bin/awk","awk","-f","ouk.awk",argv[k],NULL);
        exit(1);
    }

}
    }

    };

这里是 ouk.awk 文件内容

{ for (i=NF;i>=1;i--){ if(s){s=s" "$i} else{s=$i }}{print s;s=""}}

基本上我尝试做的是创建一些 argc 进程,并且数量是偶数以镜像文件中的文本,如果不从每一行向后重新排列单词,我面临的问题是

fprintf(fo,"%c",line[j])

不工作,当我尝试执行 awk 脚本时也出现错误

awk: can't open file >
 input record number 6, file >
 source line number 1

如果我只在终端中使用相同的文件运行 awk 命令,它可以完美运行,因此它必须与 execl 命令有关。

还有一件事,我尝试了以下命令来重命名 temp.txt int argv[k]

execl("bin/mv","temp.txt",argv[k],NULL)

但它崩溃了。

如果有人可以帮助我或给我一个好的 exec c 命令教程的链接,那就太好了,非常感谢

【问题讨论】:

    标签: c file unix awk exec


    【解决方案1】:

    for 循环超出了数组的边界(这是未定义的行为):

    for (k=0; k<=argc; k++) {
        /* ...snip... */
        fi=fopen(argv[k], "r");
    

    因为数组的索引从零开始,从0N-1,其中N 是数组中的元素数。 for 的终止条件必须为k &lt; argc。此外,argv 中的第一个元素是您要排除的程序的名称:

    for (k = 1; k < argc; k++)
    

    调用execl() 时,您需要将最后一个参数转换为char*

    execl("/usr/bin/awk","awk","-f","ouk.awk",argv[k], (char*)NULL);
    

    【讨论】:

    • @JackRobinson,它可能有效,但从链接的参考页面:参数列表必须由 NULL 指针终止,并且,由于这些是可变参数函数,因此必须强制转换此指针 ( char *) NULL。
    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 2012-07-26
    • 2011-12-14
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    相关资源
    最近更新 更多