GNU/Linux >> Belajar Linux >  >> Linux

Proses Linux – Lingkungan eksternal, lingkungan, getenv, setenv

Ini adalah artikel pertama dari seri baru tentang proses di Linux.

Fokus seri ini adalah pada aspek praktis dari lingkungan proses, kontrol proses, hubungan proses, dll.

Pada artikel ini, kita akan membahas cara mendapatkan dan mengatur variabel lingkungan di dalam program C.

Linux Processes Series:part 1 (artikel ini), part 2, part 3

Apa itu Proses?

Sebuah proses dapat dianggap sebagai sebuah instance dari sebuah program yang sedang dieksekusi. Kami menyebutnya sebagai 'instance program', karena jika program yang sama dijalankan katakanlah 10 kali maka akan ada 10 proses yang sesuai.

Ke depan, setiap proses memiliki ID proses uniknya sendiri yang melaluinya diidentifikasi dalam sistem. Selain ID itu sendiri, ID proses induk juga dikaitkan dengan suatu proses.

Fungsi main()

Program 'C' selalu dimulai dengan panggilan ke fungsi main(). Ini adalah fungsi pertama yang dipanggil saat program dijalankan.

Prototipe fungsi main() adalah :

int main(int argc, char *argv[]);

Dalam prototipe di atas :

  • Tipe kembalian fungsi main() adalah 'int'. Ini karena,, ketika fungsi main() keluar, program selesai. Dan tipe pengembalian dari main() akan menandakan apakah program dijalankan dengan benar atau tidak. Dalam arti sempit kami mengatakan bahwa jika main() mengembalikan '0', maka program berhasil dijalankan. Nilai pengembalian lainnya menunjukkan kegagalan.
  • Fungsi main() menerima dua argumen. Salah satunya adalah jumlah argumen baris perintah dan yang lainnya adalah daftar semua argumen baris perintah.

Mari kita ambil contoh kode kecil yang menjelaskan poin-poin yang disebutkan di atas.

#include<stdio.h>

int main(int argc, char *argv[])
{
  int count = argc;
  printf("\n The number of arguments passed is [%d] \n", count);

  int c = 0;
  while(c < count)
  {
    printf("\n The argument [%d] is : [%s]\n", c+1, argv[c]);
    c++;
  }
  return 0;
}

Kode C di atas mencetak jumlah argumen baris perintah yang diteruskan ke sana, dan juga mencetak nilai setiap argumen.

Ketika program dijalankan, ini akan menampilkan output berikut:

$ ./main abc 1 3

The number of arguments passed is [4]

The argument [1] is : [./main]

The argument [2] is : [abc]

The argument [3] is : [1]

The argument [4] is : [3]

Kami meneruskan 3 argumen ke program 'utama', tetapi log memberi tahu bahwa ia menerima 4 argumen. Ini karena nama program (yang kita gunakan untuk menjalankannya) juga diperlakukan sebagai argumen baris perintah.

Juga, karena program di atas dijalankan di terminal, nilai kembalian dari fungsi main() juga dikirim ke sana. Anda dapat menggunakan parameter khusus bash Shell $? seperti yang ditunjukkan di bawah ini untuk memeriksa nilai pengembalian (0 menunjukkan keberhasilan).

$ echo $?
0
  • Kembali ke fungsi utama, ketika program C dijalankan oleh kernel, fungsi 'exec' digunakan untuk memicu program.
  • Kemudian pada langkah berikutnya, rutinitas startup biasa dipanggil tepat sebelum fungsi main() program.
  • Demikian pula ketika sebuah program mengakhiri eksekusi, maka rutinitas akhir yang khas juga dipanggil.
  • Jika kita melihat file yang dapat dieksekusi, kita akan menemukan bahwa file tersebut menentukan rutinitas awal dan alamat rutin ens sebagai rutinitas pertama dan rutin terakhir yang akan dipanggil.
  • Rutinitas startup mengambil argumen baris perintah, lingkungan dll dari kernel dan meneruskannya ke fungsi main().
  • Seluruh setup yang terdiri dari rutinitas startup dan end ini dilakukan oleh linker pada tahap linking dari proses kompilasi.

Daftar Lingkungan

Ketik perintah 'env' pada prompt Linux Anda dan Anda akan mendapatkan daftar pasangan nama =nilai. Ini mewakili lingkungan shell Anda. Demikian pula, suatu proses juga memiliki lingkungannya. Ada dua cara di mana kita dapat mengakses lingkungan proses:

  1. Melalui variabel global ‘extern char **extern
  2. Melalui argumen ketiga ke fungsi main() ‘char *envp[]’

Mengenai envp[] (argumen ke-3), Anda mungkin bertanya dari mana argumen ketiga ke fungsi main() berasal seperti yang telah kita bahas sebelumnya bahwa fungsi main() hanya memiliki dua argumen.

Yah, secara historis argumen ketiga (array lingkungan) ke fungsi main() hadir. Tetapi ISO C menetapkan bahwa fungsi main() ditulis hanya dengan dua argumen. Oleh karena itu kami tidak menggunakan argumen ketiga ini ketika kami menentukan fungsi utama. Tapi, kita bisa mengakses envp[] ini di dalam program.

Bagaimanapun, kembali ke daftar lingkungan, cuplikan kode berikut menentukan cara mengakses lingkungan dari dalam suatu proses :

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

extern char **environ;

int main(int argc, char *argv[])
{
  int count = 0;

  printf("\n");
  while(environ[count] != NULL)
  {
    printf("[%s] :: ", environ[count]);
    count++;
  }

  char *val = getenv("USER");
  printf("\n\nCurrent value of environment variable USER is [%s]\n",val);

  if(setenv("USER","Arora",1))
  {
    printf("\n setenv() failed\n");
    return 1;
  }

  printf("\n Successfully Added a new value to existing environment variable USER\n");

  val = getenv("USER");
  printf("\nNew value of environment variable USER is [%s]\n",val);

  while(1)
  {
    sleep(2);
  }
  return 0;
}

Dalam kode di atas, kami telah menggunakan variabel global 'lingkungan' untuk mengakses semua variabel lingkungan. Kami juga telah menggunakan dua fungsi :

  • getenv – Dapatkan nilai dari variabel lingkungan tertentu
  • setenv – Menetapkan nilai baru ke variabel lingkungan

Keluaran dari program di atas adalah :

$ ./environ

[ORBIT_SOCKETDIR=/tmp/orbit-himanshu] :: [SSH_AGENT_PID=1627] :: [TERM=xterm] ::
[SHELL=/bin/bash] :: [WINDOWID=39846040] :: [GTK_MODULES=canberra-gtk-module] ::
[USER=himanshu] :: [SSH_AUTH_SOCK=/tmp/keyring-6kpqGc/ssh] ::
..
..

Current value of environment variable USER is [himanshu]

Successfully Added a new value to existing environment variable USER

New value of environment variable USER is [Arora]

Output di atas mencetak seluruh daftar lingkungan ke stdout. Cuplikan kode di atas juga menggunakan getenv dan setenv untuk mendapatkan variabel lingkungan USER dan mengubah nilainya.


Linux
  1. Perintah Linux ps

  2. Cara mendeteksi jika OS Linux menggunakan lingkungan KDE atau Gnome

  3. aksesibilitas variabel lingkungan di Linux

  1. Cara Membunuh Proses yang Berjalan di Linux

  2. Temukan Proses Orphan Linux

  3. Apakah utas diimplementasikan sebagai proses di Linux?

  1. Cara Mendaftar Proses yang Berjalan di Linux

  2. C # di lingkungan linux

  3. Mengatur variabel lingkungan Linux