ท่านผู้อ่านครับ  บางครั้งบางคราเราต้องการใช้งานโปรแกรมของชาวบ้านที่แจกให้ใช้ฟรีมารวมกับโปรแกรมของเรา  ถ้าเผอิญชาติที่แล้วเราทำบุญมามาก เราก็จะพบว่าโปรแกรมมีไลบราลีให้เรียกใช้ แต่ถ้าบุญวาสนาเราไม่ถึงก็จะเจอแค่ไฟล์ที่เป็น  binary มา แล้วทีนี้จะทำอย่างไรกันดีล่ะครับ

โชคดีที่ในภาษา C มี ฟังก์ชัน system และ popen เพื่อจัดการปัญหาเหล่านี้ได้ เสียดายอย่างเดียวที่ไม่อยู่ใน standard library (ISO/ANSI C)  แต่จะเป็นมาตรฐาน POSIX ซึ่งผู้นำไปใช้ก็จะต้องเจอความเสี่ยงเนื่องจาก มาตรฐานของ POSIX จะขึ้นอยู่กับระบบปฏิบัติการด้วย ครับ

ฟังก์ชั่น system

ฟังก์ชั่นนี้ ใช้สำหรับเรียกโปรแกรมอื่น ซึ่งเราจะระบุคำสั่งที่ใช้งานเป็นสตริงของคำสั่ง  ซึ่งเมื่อเราเรียกใช้คำสั่งนี้แล้ว ระบบจะทำการเรียกคำสั่งดังกล่าวให้แทน
รูปแบบฟังก์ชั่น

#include <stdlib.h>

int system(const char *command);

ตัวอย่างโปรแกรม

//ไฟล์ Hello.c
void main(){
printf(“This is an output from Hello.c\n”);
}

คอมไพล์เป็นไฟล์ binary ชื่อ hello_out  ด้วย gcc

gcc -o hello_out  Hello.c

//ไฟล์ Call_Hello.c
#include <stdlib.h>

void main(){
printf(“This is an output from Call_Hello.c\n”);
system(“./hello_out”) ;
}

คอมไพล์เป็นไฟล์ binary ชื่อ callHello  ด้วย gcc

gcc -o Call_Hello  Call_Hello.c

ผลลัพธ์จากการรันโปรแกรม  Call_Hello

./Call_Hello
This is an output from Call_Hello.c
This is an output from Hello.c

ฟังก์ชั่น  popen

ในกรณีที่เราต้องการผลลัพธ์ของการทำงานของโปรแกรมภายนอกที่เราเรียกมาใช้งานในโปรแกรม คำสั่ง system นั้นไม่สามารถให้ผลลัพธ์ดังกล่าวได้โดยตรง  แต่ก็มีวิธีการอยู่ เช่น สร้างเอาท์พุตไฟล์ไว้แล้วให้โปรแกรมเราไปเรียกใช้งาน อย่างไรก็ตาม เนื่องจากการควบคุมไม่ได้อยู่ในโปรแกรมเองทำให้อาจเกิดปัญหาได้ เช่นกรณีของการเขียนเอาท์พุตที่ยังไม่เสร็จแล้วโปรแกรมไปเรียกใช้งาน เป็นต้น

ในกรณีแบบนี้เราสามารถใช้ฟังก์ชั่น popen  เพื่อแก้ปัญหาดังกล่าว โดย popen เป็นฟังก์ชั่นในการสร้าง pipe ระหว่างโปรแกรมของเรากับโปรแกรมภายนอก ซึ่งผลลัพธ์ที่เกิดจากการใช้ฟังก์ชั่นนี้ จะได้ file pointer ชี้ไปยังตำแหน่งแรกของหน่วยความจำที่เก็บผลลัพธ์เอาไว้  ซึ่งเราสามารถนำมาใช้ในตัวโปรแกรมของเราได้

รูปแบบฟังก์ชั่น
#include <stdio.h>

FILE *popen(const char *command, const char *type); //เปิด stream  output ของคำสั่ง

int pclose(FILE *stream);  // ปิด stream

ตัวอย่างโปรแกรม
//feching.c
#include <stdio.h>

int main(){
     char *cmd = “./Call_Hello”;
     FILE *inpipe = popen(cmd,”r”);
     char inbuff[1000];
     int line=0;

    printf(“Fetching output from Call_Hello.c\n”);
    while(fgets(inbuff,sizeof(inbuff), inpipe)){
       printf(“line  %d:  %s  \nend”, ++line,inbuff);
   }
   pclose(inpipe);
    printf(“End feching output\n”);
   return 0;
}

คอมไพล์เป็นไฟล์ binary ชื่อ callHello  ด้วย gcc

gcc -o fetching  fetching.c

ผลลัพธ์จากการรันคำสั่ง
./fetching 

Fetching output from Call_Hello.c
line 1: This is an output from Call_Hello.c
line 2: This is an output from Hello.c
End feching output

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s