GNU/Linux >> Belajar Linux >  >> Linux

Jalankan program dari dalam program C

Anda ingin menggunakan popen . Ini memberi Anda pipa searah yang dengannya Anda dapat mengakses stdin dan stdout dari program.

popen adalah standar pada unix modern dan OS mirip unix, di mana Linux adalah salah satunya :-)

Ketik

man popen

di terminal untuk membaca lebih lanjut tentangnya.

EDIT

Apakah popen menghasilkan pipa searah atau dua arah tergantung pada implementasinya. Di Linux dan OpenBSD, popen menghasilkan pipa searah, yang read-only atau write-only. Di OS X, FreeBSD dan NetBSD popen menghasilkan pipa dua arah.


Saya menulis beberapa contoh kode C untuk orang lain beberapa waktu lalu yang menunjukkan cara melakukan ini. Ini dia untuk Anda:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

void error(char *s);
char *data = "Some input data\n";

main()
{
  int in[2], out[2], n, pid;
  char buf[255];

  /* In a pipe, xx[0] is for reading, xx[1] is for writing */
  if (pipe(in) < 0) error("pipe in");
  if (pipe(out) < 0) error("pipe out");

  if ((pid=fork()) == 0) {
    /* This is the child process */

    /* Close stdin, stdout, stderr */
    close(0);
    close(1);
    close(2);
    /* make our pipes, our new stdin,stdout and stderr */
    dup2(in[0],0);
    dup2(out[1],1);
    dup2(out[1],2);

    /* Close the other ends of the pipes that the parent will use, because if
     * we leave these open in the child, the child/parent will not get an EOF
     * when the parent/child closes their end of the pipe.
     */
    close(in[1]);
    close(out[0]);

    /* Over-write the child process with the hexdump binary */
    execl("/usr/bin/hexdump", "hexdump", "-C", (char *)NULL);
    error("Could not exec hexdump");
  }

  printf("Spawned 'hexdump -C' as a child process at pid %d\n", pid);

  /* This is the parent process */
  /* Close the pipe ends that the child uses to read from / write to so
   * the when we close the others, an EOF will be transmitted properly.
   */
  close(in[0]);
  close(out[1]);

  printf("<- %s", data);
  /* Write some data to the childs input */
  write(in[1], data, strlen(data));

  /* Because of the small amount of data, the child may block unless we
   * close it's input stream. This sends an EOF to the child on it's
   * stdin.
   */
  close(in[1]);

  /* Read back any output */
  n = read(out[0], buf, 250);
  buf[n] = 0;
  printf("-> %s",buf);
  exit(0);
}

void error(char *s)
{
  perror(s);
  exit(1);
}

  1. Buat dua pipa dengan pipe(...) , satu untuk stdin , satu untuk stdout .
  2. fork(...) prosesnya.
  3. Dalam proses anak (di mana fork(...) mengembalikan 0) dup (...) pipa ke stdin /stdout .
  4. exec[v][e] file program yang akan dimulai dalam proses anak.
  5. Dalam proses induk (di mana fork ) mengembalikan PID anak) melakukan perulangan yang membaca dari stdout anak (select(...) atau poll(...) , read(...) ) ke dalam buffer, sampai anak tersebut berhenti (waitpid(...) ).
  6. Akhirnya beri anak masukan tentang stdin jika mengharapkan beberapa.
  7. Setelah selesai close(...) pipa.

Linux
  1. Bagaimana Membuat Program Dapat Dieksekusi Dari Mana Saja?

  2. Dapatkan Jalur Lengkap Dari Dalam Skrip Bash?

  3. Cegah Sigint Mencapai Proses Anak?

  1. Bagaimana cara mendapatkan nilai pengembalian dari PROSES ANAK?

  2. Jalankan skrip bash dari URL

  3. Bagaimana cara menemukan path lengkap program C++ Linux dari dalam?

  1. Bagaimana cara mendapatkan output dari gdb.execute di PythonGDB (GDB 7.1)?

  2. Memanggil fungsi userspace dari dalam modul kernel Linux

  3. Cara mendapatkan proses anak dari proses induk