Функция Execlp не может найти двоичные файлы - PullRequest
0 голосов
/ 15 декабря 2018

Я делаю простое задание, включающее pipe и 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, давая ему полный путь, но он не работает.
Это дает мнеerros "sort: нет такого файла или каталога" Exec никогда не давал мне этой проблемы, что это?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Содержимое двух 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

Итак, сообщение не о том, что двоичный файл не найден, но sort не может найти файл wtfomg, который был передан в качестве аргумента.

0 голосов
/ 15 декабря 2018

Найдите команду sort в вашей настройке.Обычно sort существует в пути /usr/bin/.Используйте это

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

вместо

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