2012-12-03 5 views
0

리눅스 (CentOS 64 비트)에서 C 프로그램의 전자 메일을 보내려고합니다. 다음 코드는 치료를 처리합니다.C에서 비 차단 sendmail

asprintf(&cmd,"/usr/sbin/sendmail -oi -t -f [email protected] [email protected]"); 
asprintf(&bdy,"From: [email protected]\nTo: [email protected]\nSubject: blah blah\n\nThis is the message body\n"); 

FILE *out = popen(cmd,"w"); 
fprintf(out,"%s",bdy); 
pclose(out); 

문제는 차단하기까지이며 돌아 오기 전에 최대 2 분 또는 2 초가 걸립니다. 차단하지 않고 이메일을 보내는 방법은 무엇입니까?

추가 정보 : 문제는 popen이 (가) 차단되어 돌아 오기 전에 완료되기를 기다리는 것입니다. 그래서 아마 센드 메일을 사용하는 또 다른 방법을 찾고있을 것이다. 나는 정말로 그 모든 팽창과 함께 추가 라이브러리를 사용하고 싶지 않습니다. 가능한 한 포크를하지 않는 것이 좋습니다. (popen은 이미 fork하지만, 호출자에게 리턴하기 전에 완료하기를 기다린다.) popen에 해당하는 블록이 있는가?

+1

메일을 보내는 동안 계속 실행 프로그램을 할 수 있습니다 (fork()를 사용하는 것처럼 간단 할 수있다) 다른 스레드에서 보낼 수 있습니다, 쉘에서 직접 같은 호출을하면 시간이 좀 걸릴 것입니다. "느린"센드 메일은 로컬 컴퓨터의 DNS 구성에 문제가 있음을 나타낼 수 있습니다. – ShiDoiSi

+0

실제로 그것은 디자인에 의해 차단되고 작업이 완료 될 때까지 기다리는 popen과 관련이 있습니다. 지금까지 내가 생각한 최선의 해결책은 이메일을 파일에 작성하고 bash 스크립트로 보내도록하는 것이다. 그러나 이것은 지저분한 일이며 C로 처리하는 것이 훨씬 편할 것입니다. – poby

+0

MTA에 이메일을 보내면 너무 오래 걸리지 않을 것입니다. 일반적으로 설정을 변경하지 않는 한 메일은 그냥 스풀링됩니다. – ShiDoiSi

답변

0

일부 SMTP 클라이언트 라이브러리를 사용할 수도 있습니다 (this question 참조).

컴퓨터를 SMTP smart host으로 설정할 수 있습니다.

또한 직접 자세한 내용은 Advanced Linux Programming을 읽고 .... fork(2), pipe(2), dup2(2), execve(2), poll(2), waitpid(2) 등과 같은 낮은 수준의 프로세스 관련 시스템 콜을 사용할 수 있습니다.

감히 멀티 스레딩을 사용할 수 있습니다. pthreads에 대해 자세히 알아보십시오.

+0

클라이언트 라이브러리 나 스마트 호스트를 사용하고 싶지 않습니다. 차단하지 않고 다른 라이브러리를 사용하지 않고 이메일을 보낼 수있는 방법이 있는지 알고 싶습니다. – poby

+1

SMTP 프로토콜에는 지연 (지연)이 포함될 수 있습니다.이 지연은 사용자가 (잘못) "차단"이라고합니다. –

+0

SMTP 메일 전송은 소요되는 시간이 오래 걸리지 만 C 프로그램이 끝내기를 기다리는 것을 원하지 않습니다. 나는 그것을 보내고, 계속해서 전화를 걸어주고 싶다. 이메일을 보내는 데 얼마나 오래 걸릴지는 신경 쓰지 않습니다. 블로깅이 계속되고 CPU가 단일 전자 메일을 보내는 데 걸리는 시간이 얼마 남지 않았습니까? – poby

1

가장 간단한 해결책은 내가 문제가`popen`에서 정말 아닌 것 같아요

+1

나는 멀티 스레딩과 관련된 시스템 콜을'fork'라고 부르지 않을 것입니다. 다중 처리와 관련이 있습니다. –

+0

어쨌든 나는 포핀 포크를 이해하고 있습니다. 그러나 그것이 끝날 때까지 차단되어 부모에게 출력을 제공합니다. 나는이 정보를 원하지 않는다. 계속 하시려면 – poby

+0

@BasileStarynkevitch : 멀티 프로세싱 또한 멀티 스레딩입니다. 비 좀비 프로세스가 아닌 경우 적어도 N 개의 스레드가 있습니다. –