execl命令写入文件

时间:2013-04-15 16:38:48

标签: c unix exec

#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){
                execl("/user/bin/rev","rev",argv[k],">",argv[k],NULL);
                exit(1);
            }
        }
        else
         {
         if (fork()==0){
         execl("/usr/bin/awk","awk","-f","ouk.awk",argv[k],">",argv[k],NULL);
         exit(1);


         }
             wait(0);
    }

}
}

awk脚本

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

有人可以告诉我为什么这不起作用?我想要做的是修改 文件argv [i]使用awk脚本或rev命令

由于

1 个答案:

答案 0 :(得分:1)

要使管道(>)工作,需要涉及shell。 OP的代码不会调用shell,而是直接启动awk进程。

您可能想要替换此行:

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

由那些人:

char cmd[PATHMAX] = "";
sprintf(cmd, "\"/usr/bin/awk -f out.awk %s > %s\"", argv[k], argv[k]);
execl("/bin/sh", "sh", "-c", cmd, (char *) NULL);
/* As execl() does not return if successful, getting here indicates an error! */
perror("execl() failed");

(这意味着argv[k]引用的字符串不包含空格。)

有关详细信息,请参阅shell的手册页。请注意,/bin/sh通常与其他一些shell程序相关联,例如bash