【问题标题】:execl command to write on fileexecl 命令写入文件
【发布时间】:2013-04-07 20:58:40
【问题描述】:
#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 命令

谢谢

【问题讨论】:

  • why this does not work? 请解释
  • 因为它不会修改文件,如果我单独启动命令它们会起作用,但像这样它不会
  • this question不相似

标签: c unix exec


【解决方案1】:

要让管道 (&gt;) 工作,需要涉及 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2013-10-07
    • 2012-02-18
    • 2018-10-14
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多