reacon4234
@reacon4234

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

execve関数の第一引数(パス)を標準入力から受け取りたい

Q&A

Closed

解決したいこと

閲覧ありがとうございます。

標準入力から実行ファイルのパスを受取り、その実行ファイルをexec系の関数で実行するというプログラムを考えています。

ただ、パス名の受取がうまく行っておらず、原因がわかる方がいればご教授いただければ幸いですm(_ _)m

該当するソースコード

static void exec(){
    char PATH[256]; 
    fgets(PATH,256,stdin);
    char *args[] = {PATH,NULL,NULL};
    execve(PATH,args,NULL);
    err(EXIT_FAILURE,"execve() failed.");
}

実行時エラー

ファイルパス(例:/usr/bin/ps)を入力した後に以下のエラーが表示されます

a.out: execev() failed.: No such file or directory

コード全体

参考までにソースコードの全体を載せておきます。

sample.c
#include <stdio.h>
#include <err.h>
#include <stdlib.h>
#include <unistd.h>

static void exec(){
    char PATH[256]; 
    fgets(PATH,256,stdin);
    char *args[] = {PATH,NULL,NULL};
    execve(PATH,args,NULL);
    err(EXIT_FAILURE,"execve() failed.");
}

void main(void){
    while(1){
        pid_t pid = fork();
        if(pid < 0){
            err(EXIT_FAILURE, "fork() failed.");
        }else if(pid == 0){
            exec();
        }
    }
}
0

1Answer

fgets()が返す文字列の最後には改行文字が残るので、それを除去する必要がありそうです。

1Like

Comments

  1. @reacon4234

    Questioner

    回答ありがとうございます!
    アドバイス通り、以下のように改行文字を置き換えたら解決しました!@itagagakiさんありがとうございました!!!

    int length = strlen(PATH);
    if (PATH[length - 1] == '\n') {
    PATH[--length] = '\0';
    }

Your answer might help someone💌