#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”,线[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)
但它崩溃了。
如果有人可以帮助我或给我一个好的执行命令教程的链接,那就太棒了,非常感谢
答案 0 :(得分:1)
for
循环超出了数组的范围(这是未定义的行为):
for (k=0; k<=argc; k++) {
/* ...snip... */
fi=fopen(argv[k], "r");
因为数组具有从零开始的索引,从0
运行到N-1
,其中N
是数组中元素的数量。 for
的终止条件必须为k < argc
。此外,argv
中的第一个元素是您要排除的程序的名称:
for (k = 1; k < argc; k++)
调用execl()
时,您需要将最后一个参数转换为char*
:
execl("/usr/bin/awk","awk","-f","ouk.awk",argv[k], (char*)NULL);