C语言中用execl 函数调用bash 和sh执行脚本的区别

C语言中用execl 函数调用bash 和sh执行脚本的区别

为了简化编程,有时候需要通过execl执行脚本,而不是执行编译出来的二进制文件,然后,然后,执行脚本的时候出现了一个让我很跳脚的问题。
1、这个是用bash执行脚本的源代码test_prctl.c
 1  #include  < stdio.h >
 2  #include  < unistd.h >
 3  #include  < sys / types.h >
 4  #include  < stdlib.h >
 5  #include  < sys / prctl.h >
 6  #include  < signal.h >
 7   
 8    
 9   
10  void  my_system()
11  {
12          pid_t pid;
13       char   *  cmd  =   " gst-launch -e v4l2src ! video/x-raw-yuv,width=640,height=480,framerate=30/1  ! aspectratiocrop aspect-ratio=16/9 ! textoverlay text=\ " 测试\ "   ! timeoverlay halign=right valign=top ! clockoverlay halign=left valign=top time-format=\ " % Y /% m /% % H: % M: % S\ "  ! ffmpegcolorspace ! xvimagesink " ;
14          pid  =  fork();
15           if  (pid  ==   0 )
16          {
17                  prctl(PR_SET_PDEATHSIG, SIGKILL);
18                  execl( " /bin/bash " " /bin/bash " " -c " , cmd, NULL);
19                  exit( 0 );
20          }  else   if  (pid  <   0 )
21          {
22                  printf( " create failed\n " );
23          }
24  }
25   
26  int  main()
27  {
28           int  i  =   0 ;
29          my_system();
30       while   (  1  )
31        {
32          pause(  ) ;
33        }
34           return   0 ;
35  }
36 
2、而用sh执行脚本的源代码仅仅把上面源代码中的bash换为sh。
3、然后问题来了,我把他们编译执行之后得到的结果如下
1)用bash执行脚本的结果
7758    2361    0   00 : 44  pts / 1      00 : 00 : 00  . / test_prctl
7759    7758    2   00 : 44  pts / 1      00 : 00 : 00   / usr / bin / gst - launch - 0.10   - e v4l2src  !  video / x - raw - yuv,width = 640 ,height = 480 ,framerate = 3
7763    3751    0   00 : 44  pts / 3      00 : 00 : 00  ps  - ef
2)用sh执行脚本的结果
7787    2361    0   00 : 45  pts / 1      00 : 00 : 00  . / test_prctl
7788    7787    0   00 : 45  pts / 1      00 : 00 : 00   / bin / sh  - c gst - launch  - e v4l2src  !  video / x - raw - yuv,width = 640 ,height = 480 ,framerate = 30 / 1
7789    7788    2   00 : 45  pts / 1      00 : 00 : 00   / usr / bin / gst - launch - 0.10   - e v4l2src  !  video / x - raw - yuv,width = 640 ,height = 480 ,framerate = 3
7794    3751    0   00 : 45  pts / 3      00 : 00 : 00  ps  - ef
4、上述结果会有什么影响呢?
我在C语言中想用kill函数结束 / usr / bin / gst - launch - 0.10 这个进程,在bash脚本这个源代码中很容易用getpid获得 / usr / bin / gst - launch - 0.10 的pid,而在sh的脚本这个源代码中用getpid只能得到 / bin / sh  - c gst - launch  - e v4l2src  !  video / x - raw - yuv,width = 640 ,height = 480 ,framerate = 30 / 1这个东西的pid

你可能感兴趣的:(C语言中用execl 函数调用bash 和sh执行脚本的区别)