Jika saya mengkompilasi sebuah program menggunakan gcc, dan mencoba menjalankannya dari bash shell, apa urutan langkah-langkah yang tepat diikuti oleh bash untuk menjalankannya?
Aku tahu fork()
, execve()
, loader
, dynamic linker
(dan hal-hal lain) yang terlibat, tetapi bisa seseorang memberikan urutan yang tepat dari langkah-langkah dan beberapa referensi bacaan yang cocok?
Edit:
Dari jawaban, sepertinya pertanyaan itu bisa menyiratkan banyak kemungkinan. Saya ingin mempersempit kasus sederhana:
(test.c hanya mencetak hello world)
$ gcc test.c -o test
$ ./test
Apa yang akan menjadi langkah-langkah dalam kasus di atas ( ./test
), khususnya yang terkait dengan program awal bash dalam beberapa proses anak, melakukan pemuatan, menautkan dll.?
shell
process
executable
Jake
sumber
sumber
Jawaban:
Nah, urutan yang tepat dapat bervariasi, karena mungkin ada alias shell atau fungsi yang pertama kali diperluas / ditafsirkan sebelum program yang sebenarnya dijalankan, dan kemudian perbedaan untuk nama file yang memenuhi syarat (
/usr/libexec/foo
) versus sesuatu yang akan dicari melalui semua direktori dariPATH
variabel lingkungan (adilfoo
). Juga, rincian eksekusi dapat memperumit masalah, karenafoo | bar | zot
membutuhkan lebih banyak pekerjaan untuk shell (beberapa jumlahfork(2)
,dup(2)
dan, tentu saja,pipe(2)
antara panggilan sistem lainnya), sedangkan sesuatu sepertiexec foo
ini jauh lebih sedikit bekerja sebagai shell hanya menggantikan dirinya dengan program baru (yaitu, tidakfork
). Juga penting adalah kelompok proses (terutama kelompok proses latar depan, semua PID yang makanSIGINT
ketika seseorang mulai menumbuk pada Ctrl+ C, sesi, dan apakah pekerjaan akan dijalankan di latar belakang, dipantau (foo &
) atau latar belakang, diabaikan (foo & disown
). Rincian pengalihan I / O juga akan mengubah hal-hal, misalnya, jika input standar ditutup oleh shell (foo <&-
), atau apakah file dibuka sebagai stdin (foo < blah
).strace
atau yang serupa akan memberi informasi tentang panggilan sistem tertentu yang dibuat sepanjang proses ini, dan harus ada halaman manual untuk masing-masing panggilan itu. Pembacaan tingkat sistem yang sesuai adalah sejumlah bab dari "Programming Lanjutan di Lingkungan UNIX" dari Stevens, sementara buku shell (mis., "Dari Bash ke Z Shell") akan membahas sisi sisi hal-hal dengan lebih terinci.sumber
Dengan asumsi shell contoh buku teks (untuk kejelasan kode) yang sudah berjalan (sehingga penghubung dinamis selesai), perintah yang Anda sebutkan akan membutuhkan shell untuk melakukan panggilan sistem berikut:
Perintah yang lebih rumit tentu saja menambah kerumitan pada urutan dasar ini. Dua contoh sederhana dari komplikasi dasar adalah pengalihan dasar di mana urutan buka, tutup, dup disisipkan di antara garpu dan exec dan proses latar belakang di mana menunggu dilewati (dan menunggu lain ditambahkan ke penangan sigchld).
sumber
Saya sarankan membaca Bagian 8.4.6 Menggunakan garpu dan jalankan untuk Menjalankan Program
di http://www.groupes.polymtl.ca/inf2610/documentation/ComputerSystemBook.pdf
sumber