我刚刚开始学习C编程,我对fork()
,exec()
,pipe()
等有一些不确定性。
我已经开发了这段代码,但是当我执行它时,变量c
仍为空,所以我不知道孩子是不是写入管道,还是父母没有读从它。
int main() {
int pid=0;
int pipefd[2];
char* c=(char *)malloc(sizeof(char));
FILE *fp;
pipe(pipefd);
pid=fork();
if (pid==0){
close(pipefd[0]);
dup2(pipefd[1],1);
close(pipefd[1]);
execl("ls -l | cut -c28","ls -l | cut -c28", (char *) 0);
}
else{
close(pipefd[1]);
read(pipefd[0], c, 1);
char* path="/home/random";
char* txt=".txt";
char* root=malloc(strlen(path) + strlen(txt) + sizeof(char));
strcpy(root,path);
strcat(root,c);
strcat(root,txt);
close(pipefd[0]);
fp=fopen(root,"w+");
(...)
}
问题是最终的根字符串只有"/home/random.txt"
,因为char c
中没有任何内容,我想要的是打开文件"/home/random(number stored in char c).txt"
。
答案 0 :(得分:1)
execl
执行单个命令,并且不知道诸如管道之类的shell概念。如果要执行shell命令,则必须执行shell,如下所示:
execl("/bin/sh","/bin/sh","-c","ls -l | cut -c28", (char*) 0);
答案 1 :(得分:1)
答案 2 :(得分:0)
使用strcpy / strcat似乎有点过于复杂。 snprintf可以将这3行变成一行。
snprintf( root, size_of_buf, "/home/random%s", c );
此外,请检查您的错误代码。如上所述,execl失败了,你不知道。 fork,dup2,...,也可能失败,你想早点而不是早点知道。