1

コマンド名と引数、およびオプションで最後に文字列「bg」を受け取るプログラムを書いています。「bg」文字列が渡された場合、プログラムはフォアグラウンドでない場合はバックグラウンドで引数を使用してコマンドを実行する必要があります。コード:

#include<sys/types.h>   
#include<sys/wait.h>    
#include<unistd.h>
#include<stdio.h>
#include<errno.h>
#include <stdlib.h>
#include <string.h>


int main(int argc, char* argv[])
{

pid_t pid;
int state;

if( (pid=fork())<0) {
    perror("\nError in fork");
    exit(-1);
} 
else if(pid==0) {  
    if(strcmp(argv[argc-1], "bg") == 0 ){
        strcpy(argv[argc-1],"&");
        if( (execvp(argv[1], argv)<0)) {
            perror("\nError in first execvp");
            exit(-1);
        }
    }
    else{
        if( (execvp(argv[1], argv+1)<0)) {
            perror("\nError en second el execvp");
            exit(-1);
        }
    }   

}    
wait(&state);
printf("\nMy child %d terminated with state %d\n",pid,state);

exit(0);

}

入力例:

./myprogram ls -lai bg   // in this case my program should execute "ls -lai" in background
./myprogram ls -lai      // in this case it should execute command normally in foreground 

私のコードは bg 引数が渡されていないときに機能しますが、渡されたときに "&" で置き換えようとしましたが、機能しませんでした。

4

1 に答える 1

4

プログラムをバックグラウンド化するかしないかの違いは、プログラムが終了するのを待つか、待たないかです。したがって、実際には 2 つの異なる execvp を使用する必要はありません。ただし、引数から末尾の bg を削除する必要があります。& を追加しても何も起こりません。 & はシェルのメタ文字であり、実行中のプログラムを待たないようにシェルに指示します。

したがって、あなたがすべきことは次のとおりです。

if the last argument is "bg" : decrease argc by one, set the argument that had the bg to null
fork and execvp what's in argv
if the last argument was "bg", do NOT call wait(); else call wait.
于 2013-12-26T20:25:06.447 に答える