Advance Innovation Centre
  • AIC Knowledge @ EEC for All
  • 😎Logical Thinking
    • Karel Robot
    • Code to Flowchart
    • Play with Docker
    • CNX Software
  • MCU & Interfacing with Infineon PSOCâ„Ē
    • Basic MCU Interfacing
      • Introduction to CY8CKIT-062S2-43012 Pioneer Kit
      • Development Environment Preparation
      • PSoCâ„Ē 6S2 Peripherals Interfacing (GPIO)
        • Hello World and LED Blinking
        • GPIO Principles
        • PSoCâ„Ē 6S2 GPIO-HAL LED Blink Lab
        • PSoCâ„Ē 6S2 GPIO-PDL LED Blink Lab
        • Button "Bounce" Principles
          • Push/Pull Button to Turn ON/OFF LED via HAL
          • Push/Pull Button to Turn ON/OFF LED via PDL
          • GPIO Button Interrupt via HAL
          • GPIO Button Interrupt via PDL
        • GPIO variables & functions
      • PSoCâ„Ē 6S2 Peripherals Interfacing (ADC, PWM)
        • PSoCâ„Ē 6S2 SAR ADC
          • ADC Principles
          • PSoCâ„Ē 6S2 with ADC Labs
            • Reading potentiometer sensor value via an ADC HAL
            • Reading potentiometer sensor value via an ADC PDL
        • PSoCâ„Ē 6S2 PWM & TCPWM
          • PWM Principles
          • PSoCâ„Ē 6S2 for PMW Function Labs
            • LED Brightness using PWM via HAL
            • LED Brightness using PWM via PDL
    • Sensor Interfacing and HMI
      • OLED Display
        • OLED Display Principles
        • Calling BDH’s OLED functions
        • Display ADC via Potentiometer on OLED
      • BDH Shell
        • Shell Principles
        • LED Blinking and CAPSENSE via BDH Shell
        • Adding "History" command
        • Adding "Reboot" command
        • CAPSENSE Button and Slider
          • CAPSENSE Button and Slider with Capsense Tuner
          • CAPSENSE Button and Slider using FreeRTOS
    • Serial Communication & Visualization
      • UART, I2C, SPI Communication via Infineon PSoCâ„Ē6
      • BMX160 Sensor Communication via Infineon PSoCâ„Ē6
        • Reading ADC via HAL with Potentiometer and Displaying GUI on Serial Studio
        • Reading XENSIV-DPS-3XX Pressure Sensor and Displaying GUI on Serial Studio
        • Motion Sensors GUI Integration via Serial Studio
    • IoT Connectivity & Data Analytics via Node-Red
      • Node-Red Installation
      • Setting MQTTS to MQTT Broker
      • Sending PSoC6’s sensor to MQTT (node-red)
    • Edge AI on PSoCâ„Ē
      • Machine Learning on PSoCâ„Ē6 via Edge-Impulse
    • Infineon PSoCâ„Ē Troubleshooting
  • IoT Development with Infineon PSOCâ„Ē & BDH Platform
    • PSoCâ„Ē IoT Development Kit
      • Introduction to CY8CKIT-062S2-43012 Pioneer Kit
      • Development Environment Preparation
        • Hello World and LED Blinking
    • IoT Connectivity
      • Node-Red Installation
      • Controlling PSoCâ„Ē LED using MQTT
      • Setting MQTTS to MQTT Broker
      • Sending PSoC6’s sensor to MQTT (node-red)
    • BDH IoT Connectivity
    • WireLinXâ„Ē IoT PLC
    • BDH X-Brain Data Analytics
      • PSoC6 Data Collection to CSV log file
    • Data Visualization
      • āļŠāļĢāđ‰āļēāļ‡ Dashboard āļ”āđ‰āļ§āļĒ Looker Studio
  • ðŸ–ĨïļOperation Systems
    • Prerequisites
      • Guideline from Ubuntu
        • Ubuntu and VSCode on WSL2
      • āļ•āļīāļ”āļ•āļąāđ‰āļ‡ WSL 2
      • Run Ubuntu on VirtualBox7
    • Zero to Linux Hero
      • Computer OS Architecture
      • Anatomy of Linux System
        • UNIX/Linux History
        • UNIX/Linux Evolution
        • GNU Project
        • Linux OS Architecture
        • Command Line Interface (CLI)
          • Basic Commands
          • 😎Level up your Linux Shell
          • File & Dir. Commands
          • Searching Commands
          • 😎ChatGPT-based Terminal
          • SysAdmin Commands
          • Network Commands
          • Hacker Commands
        • Busybox
        • Shell Script
          • Awk Script
          • Bash Shell Script
            • Bash Snippets
            • Bash Useful Examples
      • Anatomy of Linux Kernel
        • Linux Kernel Principles
        • Linux Environment for Developer
      • Anatomy of Embedded Linux
        • Embedded Linux
        • Host & Target
        • Cross Toolchains
        • Bootloader
        • Building Embedded Linux
    • Linux OS Dev. Engineer
      • Process Management
        • Process Basic
        • Process State
        • Basic Process Mgmt. Commands
        • Advance Process Mgmt. Commands
        • Process API Programming
      • IPC
        • IPC Anatomy
        • Signal Programming
        • Pipe Programming
        • FIFO Programming
        • Msg. Queue Programming
          • System V
        • Share Memory Programming
          • System V
        • Socket Programming
      • POSIX Threads
        • Multi-tasking Basic
        • POSIX Thread Anatomy
        • Threading Programming
      • Applied IPC
        • Remote Commander
        • Multi-Remote Commanders
      • Process Synchronization
        • Mutex Programming
        • Semaphore Programming
      • Applied IPC with Semaphore
  • ⌚Embedded Systems Development
    • Introduction to ESD
      • Why's ESD?
      • What it use for?
      • How it works?
    • Enbedded System Development via PSoC6
      • Basic MCU Interfacing
        • Introduction to CY8CKIT-062S2-43012 Pioneer Kit
        • Development Environment Preparation
        • PSoCâ„Ē 6S2 Peripherals Interfacing (GPIO)
          • Hello World and LED Blinking
          • GPIO Principles
          • PSoCâ„Ē 6S2 GPIO-HAL LED Blink Lab
          • PSoCâ„Ē 6S2 GPIO-PDL LED Blink Lab
          • Button "Bounce" Principles
            • Push/Pull Button to Turn ON/OFF LED via HAL
            • Push/Pull Button to Turn ON/OFF LED via PDL
            • GPIO Button Interrupt via HAL
            • GPIO Button Interrupt via PDL
          • GPIO variables & functions
        • PSoCâ„Ē 6S2 Peripherals Interfacing (ADC, PWM)
          • PSoCâ„Ē 6S2 SAR ADC
            • ADC Principles
            • PSoCâ„Ē 6S2 with ADC Labs
              • Reading potentiometer sensor value via an ADC HAL
              • Reading potentiometer sensor value via an ADC PDL
          • PSoCâ„Ē 6S2 PWM & TCPWM
            • PWM Principles
            • PSoCâ„Ē 6S2 for PMW Function Labs
              • LED Brightness using PWM via HAL
              • LED Brightness using PWM via PDL
      • Sensor Interfacing and HMI
        • OLED Display
          • OLED Display Principles
          • Calling BDH’s OLED functions
          • Display ADC via Potentiometer on OLED
        • BDH Shell
          • Shell Principles
          • LED Blinking and CAPSENSE via BDH Shell
          • Adding "History" command
          • Adding "Reboot" command
          • CAPSENSE Button and Slider
            • CAPSENSE Button and Slider with Capsense Tuner
            • CAPSENSE Button and Slider using FreeRTOS
      • Serial Communication & Visualization
        • UART, I2C, SPI Communication via Infineon PSoCâ„Ē6
        • BMX160 Sensor Communication via Infineon PSoCâ„Ē6
          • Reading ADC via HAL with Potentiometer and Displaying GUI on Serial Studio
          • Reading XENSIV-DPS-3XX Pressure Sensor and Displaying GUI on Serial Studio
          • Motion Sensors GUI Integration via Serial Studio
    • Edge Computing and IoT Connectivity
    • Cloud-Based Data Analytics and Digital Twin
    • Edge Vision AI
    • Resources
      • Basic Hardware and Firmware
        • Environment Preparation
          • āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Arduino IDE
            • āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđƒāļŠāđ‰āļ‡āļēāļ™ Arduino IDE
          • āļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ§āļąāļ” NI MyDAQ
            • āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŠāđ‰ Digital Multimeter -NI ELVISmx
            • āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāđƒāļŠāđ‰ Oscilloscope-NI ELVISmx
          • āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ KingstVIS
        • Basic measurement
          • Basic Digital and Analog I/O
            • LAB: Basic Digital Input/Output
            • LAB: Basic Analog Input/Output
          • Waveform
            • LAB: Oscilloscope
            • LAB: Oscilloscope and Function Generator
            • LAB: Pulse Width Modulation (PWM)
              • Homework
        • Interfacing and Communication
          • LAB: UART, RS485, RS232 Protocol
          • LAB: I2C Protocol
            • HOMEWORK
          • LAB: SPI Protocol
      • IoT Connectivity
        • Example: IoT with MQTT on Node-red
        • Data logger
        • LAB: Data Visualization
  • 🛠ïļC/C++ for Embedded Programming
    • Development Environment Preparation
      • āļ•āļīāļ”āļ•āļąāđ‰āļ‡ WSL 2
      • āļ•āļīāļ”āļ•āļąāđ‰āļ‡ Ubuntu environment
      • āļ•āļīāļ”āļ•āļąāđ‰āļ‡āđ‚āļ›āļĢāđāļāļĢāļĄ Visual Studio Code
      • āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­ Virtual studio code āđ€āļ‚āđ‰āļēāļāļąāļš WSL
      • āļ•āļīāļ”āļ•āļąāđ‰āļ‡ docker on WSL
    • Principle C/C++ Programming
      • Get started with C++
      • Makefile
        • Makefile Examples
      • Compiling and running
        • How to create a program that you can enter inputs.
          • Lab 1 Exercise
      • Arguments
        • Command line arguments in C and C++
      • signed and unsigned data types
      • Variable and Operator
      • If and If else
      • Loop, Infinite loop, and flag
        • Loop and Flag exercise
      • Array
        • Get to know with arrays
        • Implement example
      • Vector
    • Object Oriented Programming (OOP) in C++
      • Class and Object
      • Encapsulation and Abstraction
      • Polymorphism and Inheritance
    • C/C++ Preprocessing
      • Macro
        • Quiz Macro
      • File Inclusion
      • Conditional Compilation
      • Pragma directive
        • Quiz Pragma
    • String in C++
      • Concatenation
      • Split
    • Type conversions for C/C++
      • Conversion using Cast operator
    • Error handling
    • Data logger
      • āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđāļĨāļ°āđ€āļ‚āļĩāļĒāļ™āđ„āļŸāļĨāđŒ
      • āļāļēāļĢāļ­āđˆāļēāļ™āđ„āļŸāļĨāđŒ
      • āļāļēāļĢāđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļāļąāļšTime stamp
    • High performance programing
      • Multi-task and Multi-thread
        • Multi-threading example
      • Mutex
      • Queue
      • OpenCV
    • C/C++ Techniques
      • Makefile in action
      • Object Oriented Programming (OOP) in C++
        • Class and Object
        • Encapsulation and Abstraction
        • Polymorphism and Inheritance
      • C/C++ Preprocessing
        • Macro
          • Quiz Macro
        • File Inclusion
        • Conditional Compilation
        • Pragma directive
          • Quiz Pragma
      • Binary, Octal and Hexadecimal Numbers
      • Array and properties of an array
        • Get to know with arrays
        • Implement example
      • What's next?
  • ðŸĪ–Artificial Intelligence (AI)
    • VAMStack Design House, BUU
    • Data Analytics
      • Data cleansing
      • Data analytics
      • Data analytic exercise
    • Machine Learning
      • Neural Network Layers
      • Machine learning type
      • Dataset
      • Using Edge Impulse for AI Model
    • Basic Image Processing
      • Computer Vision using Python Language
        • Installation
        • Computer Vision Basics
          • Pixel and Color
          • Draw image
          • Basic Image processing
          • Morphology Transformations
          • Gaussian blur
          • Simple Thresholding
          • Contour
          • Canny edge detection
        • Case Study
          • Coin counting
          • Color detection & tracking
        • VAM_CV SDK
  • ⚙ïļFPGA Design and Development
    • Verilog HDL via Vivado IDE
      • LAB1: Setting Environment and Create Project
        • Create Vivado Project
      • LAB2: Hardware Description Language Work Flow
        • Simulation code
      • LAB3: Design HDL Project
        • Top Level Design
        • Top-level Simulation
      • LAB4: Asynchronous VS Synchronous Circuit
        • Simulation Synchronous counter
    • C/C++ Programming on Ultra96v2 FPGA Board
      • Application C/C++ on Ultra96v2 Part 1
        • Design Overview
        • Step 1 - Burn the image to SD card
        • Step 2 - Bring up Ultra96v2
        • Step 3 - Installing the Vitis-AI runtime packages
      • Application C/C++ on Ultra96v2 Part 2
        • STEP 1 : Setting auto boot Wifi
        • STEP 2 : How to working on Embedded
        • STEP 3 : How to run the test code
  • ðŸĪ–Robotics
    • Dobot Magician
      • Instruction of Dobot
      • Software Download
      • Basically of Program
        • Teaching and Playback
        • Write and Draw
        • LaserEngraving
        • 3D Printer
    • Robotino
      • Software Download
        • Robotino View
        • Robotino SIM
      • Charging
      • Connecting
      • Follow Line example
        • Basic block in Follow Line
    • RaspBlock
      • Get Started with Raspblock
  • ðŸšĐSpecial Topics
    • Node-Red
      • Set up Raspberry Pi
      • Install node red in Raspberry Pi
      • Get started with Node Red
        • Open node-red
        • Turn off node red
        • Install Dashboard on Node-red
        • Use node red to show message
        • Using Ultrasonic sensor with node-red
    • IoT Cloud
      • Overview
        • How do they work?
          • Basic Knowlege
      • Installations
        • Install Docker
        • Install Mosquitto Broker
        • Install InfluxDB
        • Install Telegraf
        • Install Grafana
      • Get Sensor Value and Send to MQTT
        • Connect ESP3266 to sensor
        • Connect ESP3266 to MQTT
      • Integration
    • Senses IoT
      • SENSES IoT Platform
      • LAB8: MCU send data to IoT platform
    • CrowPi Dev Kit
      • Raspberry Pi with CrowPi
      • Remote to Raspberry Pi
      • Cross-Compile
        • Lab 1: Programming and cross complier
      • Hardware and Interfaces Usage CLI
        • LAB: Usage GPIO via CLI
        • LAB: Scan I2C bus via CLI
      • Python library for Crow Pi
      • wiringPi library (C) for CrowPi
        • Lab2: Crowpi and sensors
    • LVGL Development
      • LVGL - Light and Versatile Embedded Graphics Library
        • Setting program for LVGL Simulator
        • Get started with LVGL simulator
        • Example Library of LVGL
        • Create your own screen
          • Exercise
        • Style
          • Exercise
        • Event
    • Docker OS
      • Docker OS Part 1
        • Part 1 : Installation
        • Part 2 : Basic Docker OS and Linux CLI
      • Docker OS Part 2
        • Part 1 : Docker communication
        • Part 2 : Docker compose
      • Application Gstreamer on devcontainer
        • STEP 1 : Setting gstreamer environment
        • STEP 2 : Create the Gstreamer element on template
        • STEP 3 : Testing and application on your gst element
  • ðŸĪŸRecommended by AIC
    • Skill Roadmap
      • Embedded Engineer
      • Developer
    • Hardware Programming
    • Embedded Programming
    • General-propose Programming
    • Algorithmica
    • Thai Expert Knowledge
    • RT-Thread University Program
      • Infineon PSoC6
      • Kernel
        • Kernel Basics
        • Thread Management
        • Clock Management
        • Inter-thread synchronization
        • Inter-thread communication
        • Memory Management
        • Interrupt Management
        • Kernel porting
        • Atomic Operations
        • RT-Thread SMP
        • Kernel API Changelog
      • Tools
      • Devices & Drivers
        • SENSOR Devices
        • Touch Equipment
        • CRYPTO Devices
        • AUDIO Devices
        • Pulse Encoder Devices
      • Components
        • C Library (libc)
        • ISO/ANSI C Standard
        • POSIX Standard
          • FILE (File IO)
          • Pthread
          • Timer
          • IPC Semaphore
          • IPC Message Queues
          • Dynamic Modules
        • Network Components
          • FinSH Console
          • FAL: Flash Abstraction Layer
          • Virtual File System
          • tmpfs: temporary file system
          • ulog log
          • utest testing framework
          • Power Management
          • RT-Link
        • Software Packages
          • Internet of Things
            • MQTT-umqtt
            • Telnet
          • Tools
            • SystemView
            • SEGGER_RTT
          • LVGL Manual
            • Touch Screen Driver
      • Demo
        • Infineon Gateway
        • Handwriting Recognition (MNIST)
        • Object Detection (Darknet)
        • ROS using RT-Thread
        • Control the car using RT-Thread
        • LiDAR via RT-Thread
        • Detection via RT-Thread and ROS
        • Sensor Driver Development Guide
Powered by GitBook

Assoc. Prof. Wiroon Sriborrirux, Founder of Advance Innovation Center (AIC) and Bangsaen Design House (BDH), Electrical Engineering Department, Faculty of Engineering, Burapha University

On this page

Was this helpful?

  1. Operation Systems
  2. Linux OS Dev. Engineer
  3. Process Management

Process API Programming

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ Getpid(), getppid()

āđƒāļ™āđ€āļŠāļīāļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļ–āļ—āļĩāđˆāļˆāļ°āđ€āļĢāļĩāļĒāļāļ”āļđāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđ„āļ”āđ‰āđ‚āļ”āļĒāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ‚āļ­āļ‡āļ āļēāļĐāļēāļ‹āļĩ/āļ‹āļĩāļžāļĨāļąāļŠāļžāļĨāļąāļŠ āđ„āļ”āđ‰āđāļāđˆāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ getpid() āļŠāļģāļŦāļĢāļąāļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ•āļąāļ§āļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ getppid() āļŠāļģāļŦāļĢāļąāļšāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ•āļąāļ§āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰

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

int main(void)
{
    printf("My pid = %d. My parent's pid = %d\n", getpid(), getppid());
    return 0;
}

āđāļ•āđˆāļĨāļ°āļ„āļĢāļąāđ‰āļ‡āļ—āļĩāđˆāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ showid āļāđ‡āļˆāļ°āđāļŠāļ”āļ‡ pid āļ—āļĩāđˆāđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āđ„āļ› (āđ€āļžāļīāđˆāļĄāļ‚āļķāđ‰āļ™) āđāļ•āđˆāļĒāļąāļ‡āļ„āļ‡āđ€āļ›āđ‡āļ™ parent pid āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ€āļ”āļīāļĄ

$ gcc -o showpid showpid.c -Wall
$ ./showpid
My pid = 854. My parent's pid = 381
$ ./showpid
My pid = 855. My parent's pid = 381
$ ./showpid
My pid = 856. My parent's pid = 381
$ ./showpid
My pid = 857. My parent's pid = 381
$ ps x
...
 381 p2 S 0:01 -sh (csh)
...
$ 

āļ āļēāļĒāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢāļĨāļĩāļ™āļļāļāļ‹āđŒāļŠāļļāļ”āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļŦāļĨāļąāļāļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠāļ”āļąāļ‡āđāļŠāļ”āļ‡āđƒāļ™āđāļœāļ™āļœāļąāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰āđ‚āļ”āļĒāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ System Call āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļˆāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ fork() āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™

āđ‚āļ”āļĒāļĄāļĩāļŦāļĨāļąāļāļāļēāļĢāļ„āļ·āļ­āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļŦāļĄāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™ āļ‹āļķāđˆāļ‡āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ (child process) āļˆāļ°āļĄāļĩāļŦāļĨāļēāļĒāđ€āļĨāļ‚āļ›āļĢāļ°āļˆāļģāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļžāļīāđˆāļĄāļ•āđˆāļ­āļĄāļēāļˆāļēāļāļŦāļĄāļēāļĒāđ€āļĨāļ‚āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļŠāļĢāđ‰āļēāļ‡āļŦāļĢāļ·āļ­āđ€āļĢāļĩāļĒāļāļ§āđˆāļēāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ (parent process) āļ•āļąāļ§āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļŦāļĄāđˆāļˆāļ°āļ—āļģāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāļ„āđˆāļēāļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ (code, globals, heap āđāļĨāļ° stack) āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ āļ™āļ­āļāļˆāļēāļāļ™āļąāđ‰āļ™āļ—āļąāđ‰āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāđāļĨāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļˆāļ°āđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāđˆāļ§āļĄāļāļąāļ™

āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļˆāļ°āļ—āļģāļ‡āļēāļ™āđ„āļ›āļžāļĢāđ‰āļ­āļĄāđ†āļāļąāļ™ (concurrency) āđ‚āļ”āļĒāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāļˆāļ°āļĢāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļ—āļģāļ‡āļēāļ™āđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™ āļˆāļēāļāļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āđāļŠāļ”āļ‡āļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ‚āļ­āļ‡āļ•āļģāđāļŦāļ™āđˆāļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāđ€āļŠāļĄāļ·āļ­āļ™ (virutal address space)

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđāļĨāļ°āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

  • āđ„āļĨāļšāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ unistd.h

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pid_t getpid(void);

    • āļˆāļ°āļŠāđˆāļ‡āļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļ‚āļ­āļ‡āļ•āļąāļ§āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ pid_t getppid(void);

    • āļˆāļ°āļŠāđˆāļ‡āļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāļ‚āļ­āļ‡āļ•āļąāļ§āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ int fork(void);

    • āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļŦāļĄāđˆāļ‚āļķāđ‰āļ™āļĄāļē āđ‚āļ”āļĒāļˆāļ°āļ„āļąāļ”āļĨāļ­āļāļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡āđ†āļ‚āļ­āļ‡āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ™āļĩāđ‰ (āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ) āđ‚āļ”āļĒāļˆāļ°āļŠāđˆāļ‡āļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļŦāļĄāđˆāđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ āđāļ•āđˆāļˆāļ°āļŠāđˆāļ‡āļ„āđˆāļēāļĻāļđāļ™āļĒāđŒāđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāđ€āļ­āļ‡

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 1

āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ fork() āđ€āļžāļ·āđˆāļ­āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ

// simpfork.c
#include <stdio.h>
#include <unistd.h>
main()
{
    int i;
    printf("simpfork: pid = %d\n", getpid());
    i = fork();
    printf("Did a fork. It returned %d. getpid = %d. getppid = %d\n",
        i, getpid(), getppid());
}
$ gcc -o simpfork simpfork.c -Wall
$ ./simpfork
simpfork: pid = 914
Did a fork. It returned 915. getpid = 914. getppid = 381
Did a fork. It returned 0. getpid = 915. getppid = 914

āļœāļĨāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāđ„āļ”āđ‰āđ€āļ‚āđ‰āļēāļ„āļĢāļ­āļšāļ„āļĢāļ­āļ‡ CPU āļœāļĨāļ—āļĩāđˆāļ­āļ­āļāļĄāļēāļˆāļ°āđāļŠāļ”āļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™ āļ‹āļķāđˆāļ‡āđƒāļ™āļāļĢāļ“āļĩāļ™āļĩāđ‰āļ„āļ·āļ­āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 915 āđ‚āļ”āļĒāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ (simpfork) āļˆāļ°āļĄāļĩāļŦāļĄāļēāļĒāđ€āļĨāļ‚ 914 āđāļĨāļ° bash shell āļˆāļ°āļĄāļĩāļŦāļĄāļēāļĒāđ€āļĨāļ‚ 381 āļ‹āļķāđˆāļ‡āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāļ­āļ­āļāļˆāļēāļāļāļēāļĢāļ„āļĢāļ­āļšāļ„āļĢāļ­āļ‡ CPU āđāļĨāđ‰āļ§ āļ•āļąāļ§āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļ—āļĩāđˆāđ€āļāļīāļ”āđƒāļŦāļĄāđˆ (āļŦāļĄāļēāļĒāđ€āļĨāļ‚ 915) āļāđ‡āļˆāļ°āđ€āļ‚āđ‰āļēāđ„āļ›āļ„āļĢāļ­āļšāļ„āļĢāļ­āļ‡ CPU āļ•āđˆāļ­ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āļĄāļĩāļāļēāļĢāļŠāđˆāļ‡āļ„āđˆāļēāļāļĨāļąāļšāļĄāļēāļˆāļēāļ fork() āđ€āļ—āđˆāļēāļāļąāļšāļĻāļđāļ™āļĒāđŒ (0) āđ‚āļ”āļĒāļ—āļĩāđˆāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļŦāļĨāļąāļāļāđ‡āļˆāļ°āđ€āļ›āđ‡āļ™āđ€āļĨāļ‚āļ‚āļ­āļ‡āļĄāļąāļ™āđ€āļ­āļ‡ (915) āđāļĨāđ‰āļ§āļ•āļēāļĄāļ”āđ‰āļ§āļĒāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ āļ‹āļķāđˆāļ‡āđƒāļ™āļ—āļĩāđˆāļ™āļĩāđ‰āļāđ‡āļ„āļ·āļ­ āđ‚āļ›āļĢāđāļāļĢāļĄ simpfork

āđāļ•āđˆāļ­āļĒāđˆāļēāļ‡āđ„āļĢāļāđ‡āļ•āļēāļĄāđƒāļ™āļšāļēāļ‡āļ„āļĢāļąāđ‰āļ‡āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ simpfork āđāļ•āđˆāļĨāļ°āļ„āļĢāļąāđ‰āļ‡āļāļēāļĢāđāļŠāļ”āļ‡āļœāļĨāļ­āļēāļˆāļˆāļ°āđ„āļĄāđˆāđ€āļ›āđ‡āļ™āļ•āļēāļĄāļĨāļģāļ”āļąāļšāļ‹āļ°āļ—āļĩāđ€āļ”āļĩāļĒāļ§ āļāļĨāđˆāļēāļ§āļ„āļ·āļ­ āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļ­āļēāļˆāļˆāļ°āđ„āļ”āđ‰āđ€āļ‚āđ‰āļēāļ„āļĢāļ­āļšāļ„āļĢāļ­āļ‡ CPU āļāđˆāļ­āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ āļāđ‡āđ€āļ›āđ‡āļ™āđ„āļ›āđ„āļ”āđ‰ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰

$ ./simpfork
simpfork: pid = 928
Did a fork. It returned 0. getpid = 929. getppid = 928
Did a fork. It returned 929. getpid = 928. getppid = 381 

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 2

āđ€āļžāļ·āđˆāļ­āļ„āļģāļŠāļąāđˆāļ‡āļŦāļ™āđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ›āļĢāļ°āļĄāļēāļ“ 5 āļ§āļīāļ™āļēāļ—āļĩ (sleep(5);) āđ„āļ§āđ‰āđƒāļ™āļ•āļąāļ§āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ āļ‹āļķāđˆāļ‡āļˆāļ°āļ—āļģāđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāļ—āļģāļ‡āļēāļ™āļŠāļīāđ‰āļ™āļŠāļļāļ”āđ„āļ›āļāđˆāļ­āļ™ āđ‚āļ”āļĒāđ„āļĄāđˆāđ„āļ”āđ‰āļĢāļ­āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāđ€āļŠāļĢāđ‡āļˆāļāđˆāļ­āļ™

// simpfork2.c
#include <stdio.h>
#include <unistd.h>
main()
{
        int i;
        i = fork();
        if (i == 0) {
                printf("Child. getpid() = %d, getppid() = %d\n", getpid(), getppid());
                sleep(5);
                printf("After sleeping. getpid() = %d, getppid() = %d\n",
                        getpid(), getppid());
        } else {
                printf("Parent exiting early...\n");
        }
}
$ gcc -o simpfork2 simpfork2.c -Wall 
$ ./simpfork2
Child. getpid() = 1301, getppid() = 1300
Parent exiting now
After sleeping. getpid() = 1301, getppid() = 1

āđ€āļĄāļ·āđˆāļ­āļ—āļģāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āļķāđ‰āļ™āļĄāļē āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļāđ‡āļˆāļ°āļŦāļĨāļąāļšāđ„āļ›āļŠāļąāđˆāļ§āļ‚āļ“āļ°āļ›āļĢāļ°āļĄāļēāļ“ 5 āļ§āļīāļ™āļēāļ—āļĩ āđāļ•āđˆāđ€āļĄāļ·āđˆāļ­āļ•āļ·āļ™āļ‚āļķāđ‰āļ™āļĄāļēāļ›āļĢāļēāļāļāļ§āđˆāļēāļ•āļąāļ§āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāđ„āļ”āđ‰āļ—āļģāļ‡āļēāļ™āđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™āđ„āļ›āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§ āļˆāļķāļ‡āļ—āļģāđƒāļŦāđ‰āļ„āđˆāļēāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđāļāļĢāļĄāđ€āļĄāļ·āđˆāļ­āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ getppid() āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ‡āļ„āđˆāļēāļāļĨāļąāļšāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāđ€āļ”āļīāļĄ (simpfork2) āđ„āļ”āđ‰ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļˆāļķāļ‡āļāļģāļžāļĢāđ‰āļēāđāļĄāđˆāļ—āļąāļ™āļ—āļĩ āđāļĨāļ°āļ–āļđāļāļ‚āļķāđ‰āļ™āđ„āļ›āļ­āļĒāļđāđˆāļ āļēāļĒāđƒāļ•āđ‰āļāļēāļĢāļ”āļđāđāļĨāđāļ—āļ™āļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āļąāļ§āđāļĢāļāļ‚āļ­āļ‡āļĢāļ°āļšāļšāļ—āļĩāđˆāļĄāļĩāļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠ 1 āļ‹āļķāđˆāļ‡āļĢāļđāđ‰āļˆāļąāļāļāļąāļ™āđƒāļ™āļ™āļēāļĄ init

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 3

āđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļ‚āļķāđ‰āļ™āļĄāļē āļžāļ·āđ‰āļ™āļ—āļĩāđˆāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļˆāļ°āļ–āļđāļāļ„āļąāļ”āļĨāļ­āļāļĄāļēāļˆāļēāļāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ āļŦāļĨāļąāļ‡āļˆāļēāļāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļ fork() āđāļĨāđ‰āļ§āļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļāđ‡āļˆāļ°āļĄāļĩāļžāļ·āđ‰āļ™āļ—āļĩāđˆāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ•āļąāļ§āđāļ›āļĢ j āđāļĨāļ° K āđāļĒāļāļāļąāļ™āđ„āļ› āđ‚āļ”āļĒāđ„āļĄāđˆāļāļĢāļ°āļ—āļšāļāļąāļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰

// simpfork3.c
#include <stdio.h>
#include <unistd.h>

int K;

main()
{
    int i;
    int j;
    j = 200;
    K = 300;
    printf("Before forking: j = %d, K = %d ", j, K);
    i = fork();

    if (i > 0) { /* Delay the parent */
        sleep(1);
        printf("After forking, parent: j = %d, K = %d\n", j, K);
    } else {
    j++;
    K++;
    printf("After forking, child: j = %d, K = %d\n", j, K);
    }
}
$ gcc -o simpfork3 simpfork3.c -Wall
$ ./simpfork3
Before forking: j = 200, K = 300
After forking, child: j = 201, K = 301
After forking, parent: j = 200, K = 300

āđ€āļĄāļ·āđˆāļ­āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ simpfork3 āļ”āļąāļ‡āļ‚āđ‰āļēāļ‡āļšāļ™ āļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āļ§āđˆāļēāļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āļ„āļ·āļ­ āļ„āđˆāļēāđƒāļ™āļ•āļąāļ§āđāļ›āļĢ j āđāļĨāļ° K āļ‚āļ­āļ‡āđāļ•āđˆāļĨāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļˆāļ°āđ€āļ›āļĨāļĩāđˆāļĒāļ™āđāļ›āļĨāļ‡āđāļĒāļāļ­āļ­āļāļˆāļēāļāļāļąāļ™

āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āđ€āļŦāđ‡āļ™āļžāļĪāļ•āļīāļāļĢāļĢāļĄāđƒāļ™āļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāļžāļ·āđ‰āļ™āļ—āļĩāđˆāđƒāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļˆāļēāļāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāđ„āļ”āđ‰āļŠāļąāļ”āđ€āļˆāļ™āļ‚āļķāđ‰āļ™ āļŠāļēāļĄāļēāļĢāļ–āļ—āļ”āļŠāļ­āļšāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļŦāļĄāđˆāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āđ‚āļ”āļĒāđƒāļŦāđ‰āđāļŠāļ”āļ‡āļœāļĨāļĨāļąāļžāļ˜āđŒāđ„āļ›āđ€āļāđ‡āļšāļĨāļ‡āđƒāļ™āđ„āļŸāļĨāđŒāđāļ—āļ™ āļ”āļąāļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļ™āļĩāđ‰

$ simpfork3 > output
$ cat output
Before forking: j = 200, K = 300
After forking, child: j = 201, K = 301
Before forking: j = 200, K = 300
After forking, parent: j = 200, K = 300

āļˆāļēāļāļœāļĨāļĨāļąāļžāļ˜āđŒāļˆāļ°āļŠāļąāļ‡āđ€āļāļ•āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļ§āđˆāļē āļ āļēāļĒāđƒāļ™āđ„āļŸāļĨāđŒ output āļˆāļ°āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ‹āđ‰āļģāļāļąāļ™āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™ āđ€āļ™āļ·āđˆāļ­āļ‡āļˆāļēāļāļ§āđˆāļēāđƒāļ™āļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāļ„āļģāļŠāļąāđˆāļ‡ fork() āļ™āļąāđ‰āļ™āļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ—āļĩāđˆāļˆāļ°āļ–āļđāļāļžāļīāļĄāļžāđŒāļ­āļ­āļāđ„āļ›āļĒāļąāļ‡āđ„āļŸāļĨāđŒ (standard output) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ printf("Before forking: j = %d, K = %d ", j, K); āļ™āļąāđ‰āļ™āļˆāļ°āļ–āļđāļāļžāļąāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āļŠāļąāđˆāļ§āļ„āļĢāļēāļ§ (buffer) āđ€āļ­āļēāđ„āļ§āđ‰āļāđˆāļ­āļ™ āļ‹āļķāđˆāļ‡āļ–āđ‰āļēāļĒāļąāļ‡āđ„āļĄāđˆāđ€āļ•āđ‡āļĄ buffer (āļ—āļĩāđˆāļĄāļĩāļ‚āļ™āļēāļ”āļ›āļĢāļ°āļĄāļēāļ“ 4KB āļ–āļķāļ‡ 8KB) āļāđ‡āļĒāļąāļ‡āđ„āļĄāđˆāļŠāđˆāļ‡āļ­āļ­āļāđ„āļ›āļĒāļąāļ‡āđ„āļŸāļĨāđŒāļāđˆāļ­āļ™ āđāļ•āđˆāđƒāļ™āļ‚āļ“āļ°āļ™āļąāđ‰āļ™āđ€āļ­āļ‡āļ•āļąāļ§āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļāđ‡āđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāļ„āđˆāļēāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāđ„āļ§āđ‰āđāļĨāđ‰āļ§ āļ‹āļķāđˆāļ‡āļāđ‡āļ•āļīāļ”āļ„āđˆāļēāļ—āļĩāđˆāļžāļąāļāđ€āļāđ‡āļšāđ„āļ§āđ‰āđƒāļ™ buffer āļ™āļąāđ‰āļ™āļ”āđ‰āļ§āļĒāđ€āļŠāđˆāļ™āļāļąāļ™ āļ”āļąāļ‡āļ™āļąāđ‰āļ™āđ€āļĄāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļ—āļģāļ‡āļēāļ™āđāļĨāļ°āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ printf("After forking, child: j = %d, K = %d\n", j, K); āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ”āļīāļĄāļ—āļĩāđˆāļ„āđ‰āļēāļ‡āļ­āļĒāļđāđˆāđƒāļ™ buffer āļ—āļĩāđˆāļ–āļđāļāļ„āļąāļ”āļĨāļ­āļāļĄāļēāļˆāļķāļ‡āļ–āļđāļāđ€āļ‚āļĩāļĒāļ™āļĨāļ‡āđ„āļŸāļĨāđŒāļ‹āđ‰āļģāļ­āļĩāļāļ„āļĢāļąāđ‰āļ‡āļ™āļąāđˆāļ™āđ€āļ­āļ‡

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 4

āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļĄāļ·āđˆāļ­āļ—āļąāđ‰āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāđāļĨāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ āļ•āđ‰āļ­āļ‡āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āļ—āļĢāļąāļžāļĒāļēāļāļĢāļĢāđˆāļ§āļĄāļāļąāļ™ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™ āļāļēāļĢāđ€āļ‚āđ‰āļēāļ–āļķāļ‡āđ„āļŸāļĨāđŒ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™

// simpfork4.c
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>

main() {
	int i;
	int seekp;
	int fd;
	char *s1;
	char s2[1000];

	fd = open("tmpfile", O_WRONLY | O_TRUNC | O_CREAT, 0666);

	s1 = "Before forking\n";
	write(fd, s1, strlen(s1));

	i = fork();

	if (i > 0) {
		sleep(1); /* Delay the parent by one second */
		s1 = "Parent";
	} else {
		s1 = "Child";
	}

	seekp = lseek(fd, 0, SEEK_CUR);
	sprintf(s2, "%s: After forking: Seek pointer = %d\n", s1, seekp);
	write(fd, s2, strlen(s2));
}
$ gcc -o simpfork4 simpfork4.c -Wall 
$ ./simpfork4
$ cat tmpfile
Before forking
Child: After forking: Seek pointer = 15
Parent: After forking: Seek pointer = 55

āļˆāļēāļāđ‚āļ›āļĢāđāļāļĢāļĄāļ‚āđ‰āļēāļ‡āļ•āđ‰āļ™ āđ€āļĄāļ·āđˆāļ­āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ simpfork4 āđāļĨāđ‰āļ§ āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāļˆāļ°āđ€āļĢāļīāđˆāļĄāļ—āļģāļ”āļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒāđƒāļŦāļĄāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē tmpfile āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āļāđ‡āļˆāļ°āđ€āļĢāļīāđˆāļĄāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļŦāļĄāđˆ (āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ) āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ fork() āđ‚āļ”āļĒāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āđˆāļēāļ‡āļāđ‡āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āđ„āļŸāļĨāđŒāļ™āļĩāđ‰āđƒāļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āļĢāđˆāļ§āļĄāļāļąāļ™

āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āđāļĨāļ°āļ•āļąāļ§āđāļ›āļĢāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ int execv(char *programName, char *argv[]);

    • āļˆāļ°āļĢāļ°āļšāļļāļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđāļāļĢāļĄ (programName) āļ—āļĩāđˆāļˆāļ°āļ™āļģāđ€āļ‚āđ‰āļēāļĄāļēāļšāļĢāļĢāļˆāļļāđƒāļ™āļžāļ·āđ‰āļ™āļ—āļĩāđˆāļ āļēāļĒāđƒāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļ”āļīāļĄāļĄāļĩāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđ€āļāđˆāļēāļ­āļĒāļđāđˆ āļāđ‡āļˆāļ°āļ–āļđāļāđāļ—āļĒāļ—āļĩāđˆāļ”āđ‰āļ§āļĒāđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđƒāļŦāļĄāđˆ (programName) āļ—āļąāļ™āļ—āļĩ āļŠāļģāļŦāļĢāļąāļšāļ•āļąāļ§āļžāļēāļĢāļēāļĄāļīāđ€āļ•āļ­āļĢāđŒāļ•āļąāļ§āļ–āļąāļ”āļĄāļēāļ„āļ·āļ­ argv āļˆāļ°āđ€āļ›āđ‡āļ™āļ•āļąāļ§āļ­āļ°āđ€āļĢāļĒāđŒāļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāļ”āļąāļŠāļ™āļĩāļŠāļĩāđ‰āļŠāļļāļ”āļ­āļ°āđ€āļĢāļĒāđŒāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļ„āļ§āļēāļĄ āđ‚āļ”āļĒāļŸāļąāļ‡āļāđŒāļŠāļąāļ™ exec āļ™āļĩāđ‰āļˆāļ°āļĄāļĩāļ”āđ‰āļ§āļĒāļāļąāļ™āļ–āļķāļ‡ 6 āđāļšāļš

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ void exit(int returnCode);

    • āđ€āļ›āđ‡āļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ system call āļ—āļĩāđˆāļˆāļ°āļŠāļąāđˆāļ‡āđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđ‚āļ”āļĒāļ„āđˆāļē returnCode āļˆāļ°āļ–āļđāļāļŠāđˆāļ‡āļāļĨāļąāļšāđ„āļ›āļĒāļąāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ āđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāļāļģāļĨāļąāļ‡āļ„āļ­āļĒāđƒāļŦāđ‰āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāđ€āļŠāļĢāđ‡āļˆāļŠāļĄāļšāļđāļĢāļ“āđŒ

  • āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ int wait(int *returnCode);

    • āđ€āļ›āđ‡āļ™āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ system call āļ—āļĩāđˆāļˆāļ°āļŠāđˆāļ‡āļœāļĨāđƒāļŦāđ‰āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰ system call āļ•āļąāļ§āļ™āļĩāđ‰ āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļĢāļ­āļˆāļ™āļāļĢāļ°āļ—āļąāđˆāļ‡āđāļ•āđˆāļĨāļ°āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āđ‚āļ”āļĒāđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āļąāļ§āļ™āļĩāđ‰āļ—āļģāļ‡āļēāļ™āđƒāļŦāđ‰āđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™āļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļŠāļĩāļĒāļāđˆāļ­āļ™ āđ‚āļ”āļĒāļ„āđˆāļēāļ—āļĩāđˆ system call āļ•āļąāļ§āļ™āļĩāđ‰āļˆāļ°āļŠāđˆāļ‡āļāļĨāļąāļšāļĄāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļŦāļĄāļēāļĒāđ€āļĨāļ‚āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™ āđāļĨāļ°āļĢāļŦāļąāļŠāļ—āļĩāđˆāļŠāđˆāļ‡āļ„āđˆāļēāļāļĨāļąāļšāļĄāļēāļˆāļ°āļ–āļđāļāđ€āļāđ‡āļšāļ­āļĒāļđāđˆāđƒāļ™āļ•āļąāļ§āđāļ›āļĢāļžāļ­āļĒāļ—āđŒāđ€āļ•āļ­āļĢāđŒ returnCode

    • āđ„āļĨāļšāļēāļĢāļĩāļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡ sys/wait.h

āļāļēāļĢāļŠāļīāđ‰āļ™āļŠāļļāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđ„āļ”āđ‰āļŦāļĨāļēāļĒāļāļĢāļ“āļĩ āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ€āļŠāđˆāļ™

  • āđ‚āļ›āļĢāđ€āļ‹āļŠāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļŠāļļāļ”āļ„āļģāļŠāļąāđˆāļ‡āļˆāļ™āļ–āļķāļ‡āļšāļĢāļĢāļ—āļąāļ”āļŠāļļāļ”āļ—āđ‰āļēāļĒ (last statement) āļ‚āļ­āļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ main() āđ‚āļ”āļĒāļ—āļąāđˆāļ§āđ„āļ›āļˆāļ°āđ€āļ›āđ‡āļ™āļŠāđˆāļ‡āļ„āđˆāļēāļāļĨāļąāļšāđ€āļ›āđ‡āļ™āļĻāļđāļ™āļĒāđŒ (exit (0);)

    • āļĄāļĩāļāļēāļĢāļŠāļīāđ‰āļ™āļŠāļļāļ”āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļœāļīāļ”āļžāļĨāļēāļ” (error exit) āđ‚āļ”āļĒāļ•āļąāđ‰āļ‡āđƒāļˆ āļ‹āļķāđˆāļ‡āļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāļŠāđˆāļ‡āļ„āđˆāļēāļāļĨāļąāļšāļ—āļĩāđˆāđ„āļĄāđˆāđƒāļŠāđˆāđ€āļĨāļ‚āļĻāļđāļ™āļĒāđŒ āđ€āļŠāđˆāļ™āđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ exit (2); āļŦāļĢāļ·āļ­ exit (-1); āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™

    • āļĄāļĩāļāļēāļĢāļŠāļīāđ‰āļ™āļŠāļļāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļ—āļĩāđˆāļĨāđ‰āļĄāđ€āļŦāļĨāļ§ (fatal exit) āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āļąāđ‰āļ‡āđƒāļˆ āđ€āļŠāđˆāļ™āđƒāļ™āļāļĢāļ“āļĩāļāļēāļĢāļ„āļģāļ™āļ‹āļĢāļ—āļēāļ‡āļ„āļ“āļīāļ•āļĻāļēāļŠāļ•āļĢāđŒ āđ€āļŠāđˆāļ™āļāļĢāļ“āļĩāļāļēāļĢāļŦāļēāļĢāļ”āđ‰āļ§āļĒāļĻāļđāļ™āļĒāđŒ (divided by zero) āļŦāļĢāļ·āļ­āļāļĢāļ“āļĩāđ€āļāļīāļ”āļ„āļ§āļēāļĄāļœāļīāļ”āļžāļĨāļēāļ”āđƒāļ™āļŦāļ™āđˆāļ§āļĒāđƒāļŠāđ‰āļ‡āļēāļ™āļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģ āđ€āļ›āđ‡āļ™āļ•āđ‰āļ™

    • āļĄāļĩāļāļēāļĢāļŠāļīāđ‰āļ™āļŠāļļāļ”āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāđƒāļ™āļāļĢāļ“āļĩāļ—āļĩāđˆāļĄāļĩāđ‚āļ›āļĢāđ€āļ‹āļŠāļ­āļ·āđˆāļ™āļ—āļģāļāļēāļĢāļ†āđˆāļē (kill) āļŦāļĢāļ·āļ­āļŠāļąāđˆāļ‡āđƒāļŦāđ‰āļŦāļĒāļļāļ”āđāļĨāļ°āļŠāļīāđ‰āļ™āļŠāļļāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ‚āļ›āļĢāđ€āļ‹āļŠ

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 5

āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļ•āļēāļĄāļĨāļģāļ”āļąāļšāļ—āļĩāđˆāļāļģāļŦāļ™āļ”āļ”āļąāļ‡āļĢāļđāļ›āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡ āđ‚āļ”āļĒāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ wait()āđƒāļ™āļāļēāļĢāļ„āļ§āļšāļ„āļļāļĄāļāļēāļĢāđ€āļāļīāļ”āđ‚āļ›āļĢāđ€āļ‹āļŠāļ•āļēāļĄāļĨāļģāļ”āļąāļšāļ—āļĩāđˆāļāļģāļŦāļ™āļ”

// simpfork5.c
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

int main() {

	pid_t pid1, pid2, pid3, pid4;
	printf("Parent[A] of all: %d\n", getpid());

	pid1 = fork();

	if (pid1 == 0) {   // Child Process, lets say B.
		printf("Child[B] with id: %d and its Parent id: %d \n", getpid(),
				getppid());
		pid2 = fork();
		if (pid2 == 0) { // Child process, lets say D.
			printf("Child[D] with id: %d and its Parent id: %d \n", getpid(),
					getppid());
		}
	}
	if (pid1 > 0) {
		pid3 = fork();
		if (pid3 == 0) { // Child process, lets say C.
			printf("Child[C] with id: %d and its Parent id: %d \n", getpid(),
					getppid());
			pid4 = fork();
			if (pid4 == 0) { // Child process, lets say E.
				printf("Child[E] with id: %d and its Parent id: %d \n",
						getpid(), getppid());
			}

		}
	}
	for (int i = 0; i < 3; i++)
		wait(NULL);
}

āđ€āļĄāļ·āđˆāļ­āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆ (A) āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāļ•āļēāļĄāļĨāļģāļ”āļąāļš B-->D āđāļĨāļ° C-->E

$ gcc -o simpfork5 simpfork5.c -Wall 
$ ./simpfork5
Parent[A] of all: 27385
Child[B] with id: 27386 and its Parent id: 27385
Child[C] with id: 27387 and its Parent id: 27385
Child[D] with id: 27388 and its Parent id: 27386
Child[E] with id: 27389 and its Parent id: 27387

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 6

āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ exec(), wait() āđāļĨāļ° exit()

// simpfork6.c
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(int argc, char *argv[]) {
	int pid;
	/* fork another process */
	pid = fork();
	if (pid < 0) { /* error occurred */
		fprintf(stderr, "Fork Failed\n");
		exit(-1);
	} else if (pid == 0) { /* child process */
		execlp("/bin/ls", "ls", NULL);
	} else { /* parent process */
		/* parent will wait for the child to complete */
		wait(NULL);

		printf("Child Complete -- parent now exiting.\n");
		exit(0);
	}
	return 0;
}

āđ€āļĄāļ·āđˆāļ­āļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļ•āļąāļ§āđ‚āļ›āļĢāđ€āļ‹āļŠāđāļĄāđˆāļˆāļ°āļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ—āļģāļāļēāļĢāļĢāļąāļ™āļ„āļģāļŠāļąāđˆāļ‡ ls āļˆāļ™āļāļ§āđˆāļēāļˆāļ°āļ—āļģāļ‡āļēāļ™āđ€āļŠāļĢāđ‡āļˆāļŠāļīāđ‰āļ™ āđ‚āļ”āļĒāļāļēāļĢāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ wait(NULL); āđ€āļžāļ·āđˆāļ­āļĢāļ­āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ

$ gcc -o simpfork6 simpfork6.c -Wall 
$ ./simpfork6
simpfork6 simpfork6.c
Child Complete -- parent now exiting.

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 7

āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ„āļĄāđˆāļĄāļĩāļ­āļĒāļđāđˆāđƒāļ™āļĢāļ°āļšāļšāļ›āļāļīāļšāļąāļ•āļīāļāļēāļĢ

// simpfork7.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

void main() {
	int n, m, status;

	n = fork();
	if (n == -1)
		exit(1);
	else {
		if (n != 0) /* Parent Process */
		{
			printf("-p--  value of fork %d  PID = %d \n", n, getpid());
			printf("-p--  Parent PID = %d \n", getppid());
			m = wait(&status);
			printf("-p--  first exit status = %d \n", status);
			status = status >> 8;
			printf("-p--  exit status of child process = %d\n", status);
			printf("-p--  child PID that just stop = %d\n", m);
			fflush(stdout);
			m = execl("com", "com", NULL);
			printf(" Return to parent process ** ,m=%d \n", m);
			exit(0);

		} else {
			printf("\n");
			printf("\n");
			printf("-c--  value of fork = %d \n", n);
			printf("-c--  this PID = %d and Parent PID = %d\n "\
, getpid(),
					getppid());
			sleep(4);
			fflush(stdout);
			m = execl("com", "com", NULL);
			exit(2);
		}
	}

}
$ gcc -o simpfork7 simpfork7.c -Wall 
$ ./simpfork7
-p--  value of fork 4463  PID = 4462 
-p--  Parent PID = 2646 
.
.
.
-c--  value of fork = 0 
-c--  this PID = 4463 and Parent PID = 4462
-p--  first exit status = 512 
-p--  exit status of child process = 2
-p--  child PID that just stop = 4463
 Return to parent process ** ,m=-1 

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ—āļĩāđˆ 8

āđāļŠāļ”āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĨāļąāļāļĐāļ“āļ° shell āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāđ€āļžāļ·āđˆāļ­āļĢāļąāļšāļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāļ›āđ‰āļ­āļ™āđ€āļ‚āđ‰āļēāļĄāļē (command line) āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļāđƒāļ™āļāļēāļĢāļ”āļģāđ€āļ™āļīāļ™āļāļēāļĢāļ„āļģāļŠāļąāđˆāļ‡āļ™āļąāđ‰āļ™ āđ‚āļ”āļĒāļ—āļąāđ‰āļ‡āļŠāļ­āļ‡āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ‚āđ‰āļēāļ‡āļĨāđˆāļēāļ‡āļˆāļ°āļ‚āļĩāļĒāļ™āđƒāļ™āļĢāļđāļ›āđāļšāļšāļ āļēāļĐāļē C āđāļĨāļ°āļ āļēāļĐāļē C++

// simpshell.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

/* a simple define for convenience */
#define TRUE 1

int main() {
	/* C declaration before any function call */
	int pid, i = 0;
	char tab[256], *s;

	/* the main loop of our shell */
	while (TRUE) {
		/* the printf to print strings and numbers */
		printf("prompt %d> ", i);
		/* "flush" the standard output */
		fflush(stdout);

		/* read the command line */
		s = gets(tab);

		if (s == NULL) { /* <Control+D> pressed */
			fprintf(stderr, "Bye bye\n");
			exit(0);
		}

		/* one process running */
		pid = fork();
		/* 2 processes running */
		printf("I'm running\n");

		switch (pid) /* where are we ? */
		{
		case 0: /* in the child! */
			printf("In the child\n");
			/* exec command */
			execlp(tab, tab, NULL);
			/* executed only if the exec command fails */
			perror("exec");
			exit(0);
			break;
		case -1: /* in... the parent: fork has failed no wait!*/
			perror("fork");
			break;
		default: /* in the parent, the fork worked! */
			printf("In the parent.. wait\n");
			wait(0);
			i++; /* for the next command */
		}
	}
	/* end of the loop */

	return 0;
}
$ gcc -o simpshell simpshell.c -Wall 
$ ./simpshell
prompt 0> ls
I'm running
In the parent.. wait
I'm running
In the child
pipe1.c  pipe3.c    programA   signal   simpfork7    simpshell Other_Multi-Socket.zip chat_socket   simpshell.c  simpshell.cc 
5287 done
prompt 1> date
I'm running
In the parent.. wait
I'm running
In the child
Fri Sep 12 07:42:28 ICT 2014
5288 done
prompt 2> pwd
I'm running
In the parent.. wait
I'm running
In the child
/home/wiroon/os
5289 done

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ›āļĢāđāļāļĢāļĄāđƒāļ™āļĢāļđāļ›āđāļšāļšāļ āļēāļĐāļē C++

// simpshell.cc
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <iostream>

using namespace std;

/* a simple define for convenience */
#define TRUE 1

int main() {
	int pid, i = 0;
	char tab[1024];

	/* the main loop of our shell */
	while (TRUE) {
		/* print strings and numbers */
		cout << "prompt " << i << "> ";

		/* read the command line */
		cin >> tab;

		if (tab[0] == 0) { /* <Control+D> pressed */
			cerr << "Bye bye\n";
			exit(0);
		}

		/* one process running */
		pid = fork();
		/* 2 processes running */
		cout << "I'm running\n";

		switch (pid) /* where are we ? */
		{
		case 0: /* in the child! */
			cout << "In the child\n";
			/* exec command */
			execlp(tab, tab, NULL);
			/* executed only if the exec command fails */
			perror("exec");
			exit(0);
			break;
		case -1: /* in... the parent: fork has failed no wait!*/
			perror("fork");
			break;
		default: /* in the parent, the fork worked! */
			cout << "In the parent.. wait\n";
			cout << wait(0) << " done\n";
			i++; /* for the next command */
		}
	}
	/* end of the loop */

	return 0;
}
$ g++ -o simpshell simpshell.cc -Wall 
$ ./simpshell
prompt 0> ls
I'm running
In the parent.. wait
I'm running
In the child
pipe1.c  pipe3.c    programA   signal   simpfork7    simpshell Other_Multi-Socket.zip chat_socket   simpshell.c  simpshell.cc 
5287 done
prompt 1> date
I'm running
In the parent.. wait
I'm running
In the child
Fri Sep 12 07:42:28 ICT 2014
5288 done
prompt 2> pwd
I'm running
In the parent.. wait
I'm running
In the child
/home/wiroon/os
5289 done
PreviousAdvance Process Mgmt. CommandsNextIPC

Last updated 1 year ago

Was this helpful?

ðŸ–Ĩïļ
āđāļœāļ™āļœāļąāļ‡āđāļŠāļ”āļ‡āļŠāļļāļ”āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāļˆāļąāļ”āļāļēāļĢāđ‚āļ›āļĢāđ€āļ‹āļŠ
āļāļĨāđ„āļāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ
āļāļēāļĢāļ„āļąāļ”āļĨāļ­āļāļŦāļ™āđˆāļ§āļĒāļ„āļ§āļēāļĄāļˆāļģāļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļ‹āļŠāļĨāļđāļ