0
#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=""}}

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

谢谢

4

1 回答 1

1

要让管道 ( >) 工作,需要涉及外壳。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.

于 2013-04-18T17:18:44.453 回答