Гость Опубликовано 17 марта, 2004 Жалоба Поделиться Опубликовано 17 марта, 2004 Собственно пишу программку примерно такого характера. Есть одна прога которя слушает опредеоенный порт и при попытке подключения по этому порту запускает другую программку которая уже будет обслуживать клиента. Вот функция запуска другой проги: bool start_connect(char* file, char* ip, char* sock){ int i = fork(); if( i == 0 ){ if( execl(file, file, ip, sock, NULL) == -1 ){ perror("exec"); return false; } } if(i < 0){ perror("fork"); return false; } return true; } Запуск собственно проходит нормально и работа с клиентом тоже, но вот когда я пытаюсь из запущенной проги закрыть соединение, то ничего не проходит (покраней мере следующие дискрипторы так и продолжают рости) и клиент подключенный телнетом не отрубается, так же прога остается висеть в памяти пока я не пришибу ее родителя. Подскажите как бороться???? #include #include "func.h" #include #include #define PACH_TMP "tmp/" int tmp_file(char* file_name){ FILE* F = fopen(file_name, "r"); if(F == NULL){ F = fopen(file_name, "w"); if(F == NULL){ perror(file_name); return -1; }else{ fclose(F); return 0; } }else{ printf("Connect openned\n"); return 1; } } int main(int argc, char* argv[]){ if(argc != 3)return -1; char *tmp = new char[strlen(PACH_TMP) + strlen(argv[1])]; strcpy(tmp, PACH_TMP); strcat(tmp, argv[1]); printf("%s\n", tmp); int c_sock = str_to_int(argv[2]); char buff[256]; if(tmp_file(tmp) == 0){ int r; for(;{ r = read(c_sock, buff, 255); if(r == 0)break; if(r < 0){ perror("Read socket"); close(c_sock); remove(tmp); return -1; } printf("%s\t%d\t%d\n", buff, r, c_sock); } remove(tmp); delete [] tmp; return -1; } printf("%d\n", c_sock); printf("%d\n", close(c_sock)); }; Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 28 марта, 2004 Жалоба Поделиться Опубликовано 28 марта, 2004 Как бороться спрашиваешь?... Главное не здаваться !!! Но вот несколько ...ммм советов, что ли. Во первых, чтобы чайлд окончательно издох парент должен waitpid() вызвать. Во вторых, на счет дескрипторов, ты close() только у чайлда вызываешь... он же не очищает таблицу дескрипторов парента, а надо чтобы парент close() вызвал... чайлду вообще не обязательно, хотя, конечно, крайне желательно... И в третьих, но не менее важно, нужно код форматировать, чтобы посмотрел, и сразу все ясно. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.