execlp( ) 사용에 관한 질문입니다.
글쓴이: kimyh / 작성시간: 일, 2006/11/19 - 1:22오후
소켓통신을 이용하여
mysql디비를 열어 회원가입여부를 확인한후 다시 모 프로그램으로 돌아와서 다른 내용을 수행하는 프로그램 입니다
아래와 같이 현재의 디렉토리에서 memconfirm 파일을 열어 수행한후 다시 원래의 프로그램으로 돌아와 수행토록하는 내용인데 이상하게도 memconfirm을 수행후 원래의 프로그램에서 execlp()다음부분이 실행이 않됩니다.
execlp()는 에러없이 정상적으로 잘 동작되는데 왜 다음단계로 넘어가지 못하는걸까요?
아래 해당부분 소스로 시험을 해보면 puts("test02"); 이부분부터 실행이 않됩니다.
혹시 memconfirm.c 에 무슨 문제가 있는지 몰라서 허접하지만 소스 첨부 합니다.
원래 프로그램의 execlp( ) 사용부분 ;
. . . puts("test01"); // 회원가입 테이블을 열어 회원여부를 확인한다. if(execlp("./memconfirm", "memconfirm", "arg 1", "arg 2", NULL) < 0); { perror("execlp"); exit(1); } puts("test02"); . . .
memconfirm.c 소스 ;
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include <sys/wait.h> #include<mysql.h> #include<unistd.h> // 데이터베이스 관련 상수정의 #define MYSQL_HOST "localhost" #define MYSQL_USER "user" #define MYSQL_PWD "" #define MYSQL_DB "aaaa" // ================================= // 쿼리 정의 #define SEARCH_QUERY "SELECT mb_id, mb_name FROM `member` WHERE `mb_id` = '%s'" // 변수정의 struct user { char mb_id[20]; char mb_name[20]; }member; MYSQL_RES *res; MYSQL_ROW row; MYSQL *conn, mysql; char qbuf[100]; //최대 쿼리의 사이즈 만큼 할당한다. FILE *fp; FILE *mes; FILE *mesf; int ret, mesfb; char buff[25]; char mesbuf[256]; // 함수원형 void conn_mysql(void); // MAIN 함수 int main(){ // 데이터 베이스를 초기화 해서 connection을 얻어 온다. conn_mysql(); // 데이터 베이스의 결과를 메모리에서 해지한다. mysql_free_result(res); // 데이터 베이스 연결을 닫는다. mysql_close(conn); return(0); } // 데이터 베이스 초기화 conn_mysql() void conn_mysql(){ mysql_init(&mysql); conn = mysql_real_connect(&mysql,MYSQL_HOST,MYSQL_USER,MYSQL_PWD,MYSQL_DB,0,0,0); if(conn == NULL){ fprintf(stderr,"데이터 베이스 연결 실패 %s\n",mysql_error(&mysql)); exit(1); } memset (buff, 0, 256); // 사용자 정보 검색 user_search() // 만들어진 새로운 내용을 확인한다. fp = fopen("imsi/imsiid.txt", "r"); fseek(fp, 0L, 0); ret = fread(buff, 1, 256, fp); fclose(fp); // 입력 받은 데이터를 이용 쿼리를 생성 sprintf(qbuf,SEARCH_QUERY,buff); if(mysql_query(conn,qbuf)){ fprintf(stderr,"질의 실패 %s\n",mysql_error(conn)); exit(1); } // 질의를 한 결과를 출력한다. res = mysql_store_result(conn); row = mysql_fetch_row(res); // 비회원이면 안내메세지를 보내기위한 메세지를 생성한다. if(row == 0) { // 회원여부를 가리는 파일 mesflag.txt를 생성한다. mesfb = 0; mesf = fopen("mesflag.txt", "w"); fprintf(mesf, "%d", mesfb); fclose(mesf); } else if (row != 0) { // 회원여부를 가리는 파일 mesflag.txt를 생성한다. mesfb = 1; mesf = fopen("mesflag.txt", "w"); fprintf(mesf, "%d", mesfb); fclose(mesf); // 회원이면 이름과 아이디를 저장할 새로운 임시파일을 만든다 char *mb_id_buff, mb_id_buf[20]; char *mb_name_buff, mb_name_buf[20]; FILE *imsimem; strcpy(mb_id_buf, row[0]); mb_id_buff = strdup(mb_id_buf); strcpy(mb_name_buf, row[1]); mb_name_buff = strdup(mb_name_buf); imsimem = fopen("imsi/imsimember.txt", "w"); fprintf(imsimem, "%s\n", mb_id_buff); fprintf(imsimem, "%s\n", mb_name_buff); fclose(imsimem); } }
Forums:
원래 그렇습니다 ^^;
execl 계열들을 사용하면....
함수 호출 성공시에 해당 address space가 불려진 excutable 파일로 덮여쓰여집니다.
즉 실행화일 "memconfirm" 의 main부터 시작하게 되는거지요.
그 밑으로 계속 instruction을 실행하고 싶으시다면 fork 호출후에 execl을 호출해야됩니다.
------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/
빠른답변 정말 감사합니다.
답변 내용 읽고 보니 정말 그렇군요.
알려주신대로 fork()를 사용한후 execlp()를 호출 하도록 해 보겠습니다.
정말 감사합니다.
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.
잘 되는군요.. 감사합니다.
방금 해보니까 잘 되는군요.
바쁘신중에도 빠른 답변 주신 님께 진심으로 감사드립니다.
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.
살며 그리고 사랑하며...
정보는 공유할때 그 가치가 있는것.....
나의 조그만 지식공유는 남에게 엄청난 기쁨을 안겨 준다.
댓글 달기