Запуск тривиальной программы в gdb, которая разветвляется и запускает клиента. Строка execl (находясь внутри подчиненной 2 в gdb) дает идентификатор процесса «выполняет новую программу», а затем сразу же seg faults.
Код к этому моменту следующий:
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>");
Любые идеи? Я ничего не получаю, только саму ошибку сегмента, и я получаю ее немедленно.
arg[4]
недостаточно большой. Также заведите привычку использоватьsnprintf( arg, sizeof(arg), "%d", fd[0] )
, чтобы избежать подобных ошибок. - person Steve Summit   schedule 03.05.20163
и4
. - person alk   schedule 03.05.2016