Saya punya program ini, kami'll menyebutnya Tuan rumah. Tuan rumah melakukan segala macam hal-hal yang baik, tetapi harus mampu menerima input melalui command line sementara itu's running. Ini berarti telah entah bagaimana mengirim yang lain mengolah data dan kemudian berhenti. Misalnya, saya harus mampu untuk melakukan hal ini:
./Host --blahblah 3 6 3 5
Ini harus entah bagaimana akhirnya memanggil beberapa fungsi dalam Host disebut
handleBlahBlah(int x1, int y1, int x2, int y2){
//do some more sweet stuff
}
Host adalah sebuah program C, dan tidak perlu untuk mendukung beberapa contoh.
Contoh dari hal ini adalah pemutar musik Amarok. Dengan Amarok berjalan dan bermain, anda dapat mengetik "amarok-pause" dan itu akan menghentikan musik.
Aku harus mampu untuk melakukan hal ini di Linux atau Windows. Sebaiknya Linux.
Apa yang terbersih cara untuk melaksanakan hal ini?
Jika anda berada di Windows, saya'd memberitahu anda untuk menggunakan jendela tersembunyi untuk menerima pesan, tetapi karena anda digunakan ./
, Saya asumsikan anda ingin sesuatu yang berbasis Unix.
Dalam hal ini, saya'd pergi dengan named pipe. Matahari memiliki tutorial sekitar bernama pipa yang mungkin berguna.
Program ini mungkin akan membuat pipa dan mendengarkan. Anda bisa terpisah script baris perintah yang akan membuka pipa dan hanya echo nya argumen baris perintah untuk itu.
Anda bisa memodifikasi program untuk mendukung baris perintah mengirim alih-alih menggunakan script yang terpisah. Anda'd melakukan hal yang sama hal dasar dalam kasus itu. Program anda akan melihat itu's argumen baris perintah, dan jika berlaku, membuka pipa ke "main" contoh program, dan mengirim melalui argumen.
Saya sarankan menggunakan Unix socket atau D. Menggunakan socket mungkin akan lebih cepat jika anda're akrab dengan Unix soket pemrograman dan hanya ingin beberapa operasi, sedangkan D-Bus yang mungkin membuatnya lebih mudah untuk berkonsentrasi pada pelaksanaan fungsi akrab berorientasi-objek.
Lihatlah Biija's Guide to Unix IPC, khususnya bab tentang Unix soket.
Apa tidak ada yang telah dikatakan di sini adalah ini: "anda dapat't sampai di sana dari sini".
Baris perintah ini hanya tersedia seperti ketika program anda dipanggil.
Contoh menerapkan "fillinthename argumen ..." untuk berkomunikasi dengan fillinthename setelah fillinthename berjalan hanya dapat dicapai dengan menggunakan dua contoh program yang berkomunikasi dengan satu sama lain.
Lain jawaban menyarankan cara-cara untuk mencapai komunikasi.
An amarok seperti kebutuhan program untuk mendeteksi keberadaan contoh lain dari dirinya sendiri dalam rangka untuk mengetahui peran yang harus bermain, peran utama gigih pesan penerima/server, atau peran kecil dari satu tembakan pengirim pesan.
diedit untuk membuat kata fillinthename benar-benar akan ditampilkan.
Salah satu teknik yang saya lihat adalah untuk memiliki anda Host
program menjadi hanya "shell" untuk program-program yang nyata. Misalnya ketika anda memulai aplikasi anda biasanya (misalnya: ./Host
), program akan mencabang ke "aplikasi utama" bagian dari kode anda. Ketika anda memulai program anda dalam cara yang menunjukkan anda ingin sinyal menjalankan contoh (misalnya: ./Host-mengirim-pesan-restart
), program akan mencabang ke "pengirim pesan" bagian dari kode anda. It's seperti memiliki dua aplikasi dalam satu. Pilihan lain yang doesn't menggunakan garpu
adalah untuk membuat Host
murni "pengirim pesan" aplikasi dan memiliki "aplikasi utama" sebagai terpisah yang dapat dieksekusi (misalnya: Host_core
) bahwa Host
dapat peluncuran secara terpisah.
"aplikasi utama" bagian dari program anda akan perlu untuk membuka beberapa jenis saluran komunikasi untuk menerima pesan, dan "pengirim pesan" bagian akan perlu untuk menghubungkan ke saluran tersebut dan menggunakannya untuk mengirim pesan. Ada beberapa pilihan yang berbeda tersedia untuk mengirim pesan antar proses. Beberapa yang lebih umum metode pipa dan soket. Tergantung pada OS anda, anda mungkin memiliki opsi tambahan yang tersedia; misalnya, QNX telah saluran dan BeOS/Haiku memiliki BMessages. Anda mungkin juga dapat menemukan perpustakaan yang rapi membungkus fungsi ini, seperti lcm.
Jadi, saya mungkin akan hilang intinya di sini, tapi secara deafult program C's fungsi utama membutuhkan dua argumen; argc, hitungan jumlah argumen (setidaknya satu), dan argv (atau arg vektor), daftar argumen. Anda hanya bisa mengurai melalui argumen dan memanggil metode yang benar. Misalnya:
int main(int argc, *argv[])
{
/*loop through each argument and take action*/
while (--argc > 0)
{
printf(%s%s, *++argv, (argc > 1) ? " " : "");
}
}
akan mencetak semua argumen ke layar. Saya tidak C guru, jadi saya harap saya belum't membuat kesalahan.
EDIT: Ok, dia adalah setelah sesuatu yang lain, tapi itu bukan't benar-benar jelas sebelum pertanyaan itu diedit. Don't harus melompat pada saya rep...