使用C读取exec()创建的子管道
我刚刚开始学习C编程,我对使用C读取exec()创建的子管道,c,exec,fork,pipe,C,Exec,Fork,Pipe,我刚刚开始学习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){
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”
,因为charc
中没有任何内容,我想要的是打开文件“/home/random(存储在char c.txt中的数字)”
execl
执行单个命令,并且不知道诸如管道之类的shell概念。如果要执行shell命令,必须执行shell,如下所示:
execl("/bin/sh","/bin/sh","-c","ls -l | cut -c28", (char*) 0);
始终检查系统调用(如和派生函数如)的返回值,并使用来找出哪里出了问题
在您的例子中,
execl
行失败。使用strcpy/strcat似乎有点过于复杂。snprintf可以将这三行转换为一行
snprintf( root, size_of_buf, "/home/random%s", c );
此外,请检查您的错误代码。如前所述,execl正在失败,而您对此一无所知。fork,dup2,…,也可能失败,您希望尽早知道 检查您的
execl
调用是否没有返回-我认为您不能这样调用execl
。可能值得一提的是空的argv[0]
-我认为这也不允许。他确实传递了一个argv[0]
,与程序名相同。