Execlp函数无法找到二进制文件

时间:2018-12-15 13:50:34

标签: c fork exec

我正在做一个涉及管道和exec的简单分配,这是代码。

#include <apue.h>
#include <stdio.h>

int main(void){
    int out[2];
    pipe(out);
    char file1[1024],file2[1024];
    int pid=fork();
    if(pid>0){
        close(out[0]);
        scanf("%s",file1);
        scanf("%s",file2);
        write(out[1],file1,strlen(file1));
        //write(out[1],"\0",1);
        write(out[1],file2,strlen(file2));
    }
    if(pid==0){
        int c;
        int cnt=0;
        close(out[1]);
        read(out[0],file1,1024);
        read(out[0],file2,1024);

        execlp("sort","sort",file1,NULL);

        return 0;
    }
}

问题是,execlp函数找不到排序二进制文件,
我也用execl给出了完整的路径,但是它不起作用。
它给了我错误的“排序:没有这样的文件或目录” Exec从来没有给我这个问题,这是什么?

2 个答案:

答案 0 :(得分:0)

在设置中找到sort命令。通常sort/usr/bin/路径中。使用这个

execlp("/usr/bin/sort","sort",file1,NULL);

代替

execlp("sort","sort",file1,NULL);

答案 1 :(得分:0)

两个write()的内容不会分开;读者只是将它们读为一个块,并将两个字符串串联在一起:


#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>

int main(void){
    int out[2];
    pipe(out);
    char file1[1024],file2[1024];
    int pid=fork();
    if(pid>0){
        close(out[0]);
        scanf(" %s",file1);
        scanf(" %s",file2);
        write(out[1],file1,strlen(file1));
        //write(out[1],"\0",1);
        write(out[1],file2,strlen(file2));
    }
    if(pid==0){
        int cnt=0;
        close(out[1]);
        cnt=read(out[0],file1,1024);
        file1[cnt]=0;
        cnt = read(out[0],file2,1024);
        file2[cnt]=0;

        fprintf(stderr, "about to execlp(sort|%s|%s|NULL)\n",file1,file2);
        execlp("sort","sort",file1,NULL);

        return 0;
    }
    return 0;
}

./a.out

输入为:wtf omg

输出:


plasser@pisbak$ ./a.out
wtf omg
about to execlp(sort|wtfomg||NULL)
plasser@pisbak$ sort: cannot read: wtfomg: No such file or director

因此,关于未找到二进制文件的消息是 not ,但是 sort 无法找到文件 wtfomg该参数作为参数传递。