1

私は、システムの戻り値を別のプログラムの条件文で使用しようという考えを持っていました。これが私が思いついたものです:

最初のプログラム:

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

main(void)
{
    char ans;
    scanf("%c" , &ans);
    if(ans == 'y' || ans == 'Y')
        return 1;
    else
        return 0;    
}

2 番目のプログラム (system() を呼び出すプログラム):

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

main(void)
{
    if(system("/home/M435TR0x/a.out") == 1)
        printf("you answered yes\n");
    else
        printf("you answered no");
}

しかし、これは機能しませんでしたyou answered no.printfを使用してシステムの戻り値を確認すると256、プログラムが戻る必要がある場合(0は正常に動作します) 、I got1に置き換えたときにプログラムが常に戻るためです。何が起こっているのかわかりませんが、 の場合のバイトで可能な組み合わせの数と、 の 9 ビットでの組み合わせの数を思い出します。プログラムが実行しているように 、戻り値と.return 1return 2510return 1return 2(255 << (i - 1)) + 1ii > 0

そこで実際に何が起こっているか知っている人はいますか?

4

2 に答える 2

4

状況は実装定義です。C11 7.22.4.8/3 ( system) 言います:

引数が null ポインターではなく、system関数が返される場合、実装定義の値が返されます。

それで、あなたのシステムで何が起こっているのですか?Linux を使用していて、 、 、およびsystemで実装されていると仮定しています。最後のはstatusを返します。これは 16 ビットの整数であり、プロセスが正常に終了したかシグナルを介して終了したか、および戻り値またはシグナルがそれぞれ何であったかを示します。それらにアクセスするには、 の戻り値でマクロを使用します。forkexecwaitwaitman 2 waitsystem

#include <stdlib.h.>    // for "system"

#include <sys/types.h>
#include <sys/wait.h>

int n = system(cmd);
  • WIFEXITED(n)プロセスが正常に終了した場合は true です。もしそうWEXITSTATUS(n)なら、戻り値を教えてくれます。

  • WIFSIGNALED(n)シグナルが原因でプロセスが終了した場合は true 。もしそうならWTERMSIG(n)、シグナル番号です。

補足: 私の Linux ではman 3 system、戻り値が既に で処理されているという誤った情報を提供しますがWEXITSTATUS、より最近info systemでは、戻り値が基になる からのステータスであると正しく述べていますwait

于 2013-09-02T13:31:35.323 に答える
2

のマニュアルページから、次のsystemことがわかります。

返される値は、エラー (たとえば fork(2) が失敗した) の場合は -1 で、それ以外の場合はコマンドのステータスが返されます。この後者の戻りステータスは、wait(2) で指定された形式です。したがって、コマンドの終了コードは WEXITSTATUS(status) になります。

これはsystem、プログラムの戻り値を取得できるように「解釈」する必要があるステータス番号を返すことを意味します。

したがって、2 番目のプログラムで次の操作を実行して、必要な値を取得できます。

#include <sys/types.h>
#include <sys/wait.h>

int status = system("/home/M435TR0x/a.out");
if (WIFEXITED(status)){
   if (WEXITSTATUS == 1) printf("you answered yes\n");
   else printf("you answered no");
}

WIFEXITED(status) マクロは、最初のプログラムが正常に終了したかどうかを示します。正常に終了した場合は、WEXITSTATUS(statuc) マクロが戻り値を返します。

免責事項: このコードは実行していません。間違いがある可能性があります。

于 2013-09-02T13:40:00.597 に答える