2013-10-18 3 views
0

운영 체제 관련 숙제가 있습니다. 이 숙제에는 두 가지 프로그램, 즉 "get"이라는 클라이언트 프로그램과 "iserv"라는 서버 프로그램이 구현됩니다. 서버는 다중 프로세스 프로그램이됩니다. POSIX 메시지 대기열은 프로세스 간 통신에 사용됩니다. 서버는 다음과 같이 시작됩니다. iserv 여기서는 서버가 작성하는 메시지 대기열의 이름입니다. 정수가 들어있는 텍스트 파일의 이름입니다.메이크 파일에서 POSIX Message Queue 이름을 사용하는 방법

내 iserv.c 프로그램 (하지 완료) 코드에서 알 수 있듯이

#include <linux/types.h> 
#include <linux/unistd.h> 
#include <stdio.h> 
#include <mqueue.h> 
#include <stdlib.h> 
#include <linux/string.h> 
#include <linux/fcntl.h> 
#include <linux/errno.h> 
#include <linux/wait.h> 
#include <msg.h> 

int main(int argc , char *argv[]) 
{ 
pid_t apid1; 
FILE *fp; 
mqd_t mq; 
const char *msgqueue = "/serverqueue"; 
int oflag = (O_RDWR|O_CREAT); 
mode_t mode = (S_IRUSR|S_IWUSR); 
struct mq_attr *attr = NULL; 

if(argc != 1) 
{ 
    printf("wrong number of arguments"); 
    exit(1); 
} 
//create message queue 
mq = mq_open(msgqueue ,oflag , mode , attr); 
if(mq==-1) 
{ 
    perror("can not open msg queue\n"); 
    exit(1); 
} 
printf("mq opened , mq id = %d\n" , (int) mq); 

//create child process 
apid1 = fork(); 
if(apid1 < 0) 
{ 
    perror("main():"); 
    exit(1); 
} 
if(apid1 == 0) 
{ 
    printf("this is the first child, pid = %d\n", (int) getpid()); 
    fflush(stdout); 
} 
} 

는 메시지 큐는 이름이 "serverqueue"로 작성됩니다. 내가 make 명령이 메이크 파일을 실행하면

iserv:iserv.c 
    gcc -o iserv serverqueue infile.txt -lrt 
clean: 
    rm -r *.o iserv 

, 나는 serverqueue를 얻을 : 그런 다음, 내 메이크 파일을 만들어 한 해당 파일 또는 디렉터리 오류가 발생했습니다. 서버가 어디에서 어떻게 시작될 것인가? 어디가 잘못 됐어?

제발 도와주세요, 감사합니다!

+0

죄송합니다. 새 사용자이기 때문에 일부 단어가 누락되었습니다. – Begumm

+0

이러한 누락 된 부분을 다시 작성하고 있습니다. 서버는 다음과 같이 시작됩니다. iserv . 여기에서 은 서버가 작성하는 메시지 대기열의 이름입니다. (나는 서버 큐로 이름을 만들었다). 그러나, 나는 어디에서 어떻게 메시지 큐 이름을 makefile에 넣을지 모른다. 제발 도와주세요. – Begumm

+0

gcc 명령에서 infile.txt의 목적은 무엇입니까? – PhillipD

답변

0

당신의 메이크 파일은 나에게 적합하지 않습니다. -o는 컴파일 된 출력 파일의 이름을 지정합니다. 소스 파일이 iserv.c라고하고 소스 파일의이 .c 확장자를 잊고 당신의 메이크에서

gcc -o serverqueue iserv.c -lrt 

을 컴파일, 실행 파일이 serverqueue 이름 싶은 경우.

infile.txt를 포함시킨 이유를 알 수 없습니다. 귀하의 의견에 따라

편집은 : iserv을 :

숙제에서, 다음과 같이 해당 서버가 시작됩니다 싶어한다. servq은 서버에 의해 생성되는 메시지 큐의 이름이며, 입력 파일이 다수의 양의 정수를 포함 할 텍스트 파일의 이름 인 사실이라면 코드에서 서버 큐로 생성됩니다.

아니요, 문장 iserv <servq> <inputfile>은 컴파일과 관련이 없습니다. 이것은 프로그램을 컴파일 한 후에 프로그램을 사용해야하는 방법입니다. 프로그램의 이름은 그래서 당신은 당신의 프로그램 유형 <servq>이 serverqueue하고 <inputfile>가 infile.txt 될

./iserv <servq> <inputfile> 

를 시작하려면이

gcc -o iserv iserv.c -lrt 

같은 코드를 컴파일해야 iserv입니다.

+0

숙제에서 다음과 같이 서버를 시작해야합니다. iserv . servq은 서버에 의해 생성되는 메시지 큐의 이름이며, 입력 파일이 다수의 양의 정수를 포함 할 텍스트 파일의 이름 인 사실이라면 코드에서 서버 큐로 생성됩니다. 이 양식은 필수 사항입니다. ı는 파일의 이름을 버릴 수 없습니다. 따라서 어떻게 서버를 시작할 수 있습니까? 그것이 makefile에 없다면, 그것은 어디에 있습니까? – Begumm

+0

고맙습니다 :) :)) 이제 서버를 시작할 수 있지만 메시지 큐를 열 수 없다는 오류가 발생합니다. 나는 그것을 고치려고 노력할 것이다! – Begumm

+0

@ user2894647 여러분을 환영합니다. 대답을 자유롭게 받아들이십시오 ;-) – PhillipD

관련 문제