2016-05-03 9 views
0

gdb内で些細なプログラムを実行すると、それがクライアントをforkしexeclする。 execl行(gdb内の下位2の内部)は、プロセスIDに "新しいプログラムを実行しています"と表示し、すぐにエラーを検出します。その時点まで些細なCプログラムのexec segfault

コードは、次のとおりです。

int main(int argc, char *argv[]) { 
/* Create socket pair for communication with server, and fork/exec the server code */ 
    int ret; 
    int fd[2]; 
    ret = socketpair(AF_LOCAL, SOCK_STREAM | SOCK_NONBLOCK, 0, fd); 
    if(ret < 0) { 
    perror("Unable to create initial socketpair for qrServer"); 
    return -1; 
    } 
    pid_t pid = fork(); 
    if (pid == 0) { 
    char arg[4]; 
    bzero(arg, 4); 
    close(fd[1]); 
    sprintf(arg, "%d", fd[0]); 
    char* filename = "child"; 
    ret = execl(filename, filename, arg, NULL); 

をちょうど完全を期すために、以下のように、子プログラムが開始されます:

int main(int argc, char *argv[]) { 
/* Create socket pair for communication with server, and fork/exec the server code */ 
    if(argc < 2) { 
    perror("Usage: argv[0] <file descriptor>"); 

任意のアイデア?私は何も手に入らず、ただそのseg障害自体と私はすぐにそれを得る。 man execlから

+0

ワンセグ障害を取得するソース行が何であるべきか? –

+0

'arg [4]'は十分大きくありません。また、 'snprintf(arg、sizeof(arg)、"%d "、fd [0])'を使用してこの種のフォールトを回避する習慣を習得してください。 –

+0

@SteveSummit "* ...は十分ではありません。" 2つのFDの期待値が "3"と "4"であるため、おそらくそうではありません。 – alk

答えて

0

引数のリストは、これらが可変長引数の関数なので、このポインタは(CHAR *)NULLをキャストする必要があり、NULLポインタで終了し、しなければなりません。

ので

ret = execl(filename, filename, arg, NULL); 

この行は

ret = execl(filename, filename, arg, (char*) NULL); 
+1

@ Aenid37これが役立つ場合は、お知らせください。助けがあれば、(a)あなたは64ビットプラットフォームであるが、(b) 'NULL'は平野の' 0'として定義されています。 (これは完全に合法ですが、この問題に脆弱です。) –

関連する問題