1. 程式人生 > >linux system系統呼叫

linux system系統呼叫

為了簡化執行命令的複雜程度,Linux系統提供system系統呼叫,原理是通過fork的方式產生一個子程序,在這個子程序中執行系統呼叫過程中引數裡面設定的command

system函式

  1. #include <stdlib.h>
  2. int system(const char *command);

功能:

利用fork建立子程序,然後用execl來執行/bin/sh sh -c command指令。system函式的主程序必須等待子程序執行完後再退出,並返回執行狀態。

引數:
command:需要執行的命令的字串,比如需要檢視當前目錄下的檔案資訊,則將command
設定為ls -l

返回值:

  • 出現異常時返回-1

  • 子程序正常退出,返回0或者其他值。 

實際上system()函式執行了三步操作:

  • fork一個子程序;

  • 在子程序中呼叫exec函式去執行command

  • 在父程序中呼叫wait等待子程序結束。對於fork失敗,system()函式返回-1。如果exec執行成功,則返回command通過exitreturn返回的值。

函式原始碼:

int system(const char * cmdstring)
 {
     pid_t pid;
     int status;
     if(cmdstring == NULL){        
          return (1);
     }
     if((pid = fork())<0){
             status = -1;
     }
     else if(pid == 0){
         execl("/bin/sh", "sh", "-c", cmdstring, (char *)0);
         _exit(127); //子程序正常執行則不會執行此語句
        }
     else{
             while(waitpid(pid, &status, 0) < 0){
                 if(errno != EINTER){
                     status = -1;
                     break;
                 }
             }
         }
         return status;
 }

例項:

程式設計要求

在主函式的最開始會初始化一個全部變數g_i4event0

本關的程式設計任務是補全右側程式碼片段中BeginEnd中間的程式碼,具體要求如下:

  • 執行“touch test.dat”命令;

  • 檢查命令是否執行成功,如果執行成功,則將g_i4event設為1

  • 執行成功返回0,執行失敗返回-1

測試樣例:

測試輸入:
預期輸出:
touch ./test.dat successful!
system command executed successful!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>  
#include <unistd.h> 
#include <signal.h>
#include <pthread.h>
#include <sys/types.h>
#include <dirent.h>

pthread_t pid;
int g_i4event = 0;

int do_system(void);

int do_system(void)
{
    /********Begin********/
	if(system("touch test.dat")!=-1)
    {
        g_i4event=1;
        return 0;
    }
    return -1;
	
	
    /*********End*********/
}

void *detect(void *arg)
{
	int count = 0;
	while (1)
	{
		if(access("./test.dat", F_OK))
		{
			count ++;
		}
	    switch(g_i4event)
	    {
	    	case 0:
	    	    break;
	    	case 1:
				count ++;
			    if(1 == count)
				{
					printf("system command executed successful!\n");
				}  
	    	    return NULL;
	    	default:
	    	    break;
	    }
	    g_i4event = 0;
	    usleep(10 * 1000);
	}
    return NULL;
}

int main(int argc, char *argv[])
{
	pthread_create(&pid, NULL, detect, NULL);
	if(0 == do_system())
	{
		printf("touch ./test.dat successful!\n");
	}
	else
	{
		printf("touch ./test.dat failed!\n");
	}
    pthread_join(pid, NULL);
	
    return 0;
}