Linux基础知识、设置进程自启动、进程间通信
- Linux基础学习
- linux虚拟化的作用
- linux添加用户和用户组
- linux进程间通信的几种方式
Linux基础学习
C语言main函数参数含义
在C语言中,main函数的参数包括两个:argc和argv。其中,argc表示命令行参数的个数,而argv是一个指向字符串指针的数组,每个元素指向一个命令行参数字符串。比如:
#include <stdio.h>
int main(int argc, char *argv[]) {
int i;
for (i = 0; i < argc; i++) {
printf("argv[%d]: %s\n", i, argv[i]);
}
return 0;
}
如果在命令行中输入了以下命令:
$ ./a.out hello world
那么程序的输出将会是:
argv[0]: ./a.out
argv[1]: hello
argv[2]: world
fork()函数返回值
调用fork()接口时:
- 如果返回值是0,那么说明当前进程是子进程。
- 如果返回值大于0,那么说明当前进程是父进程,返回值是子进程的PID。
- 如果返回值小于0,则表示fork()调用失败。
/* fork_test.c */
#include<sys/types.h>
#inlcude<unistd.h>
main()
{
pid_t pid;
/*此时仅有一个进程*/
pid=fork();
/*此时已经有两个进程在同时运行*/
if(pid<0)
printf("error in fork!");
else if(pid==0)
printf("I am the child process, my process ID is %d/n",getpid());
else
printf("I am the parent process, my process ID is %d/n",getpid());
}
system()和popen区别
https://zhuanlan.zhihu.com/p/457974696
1.阻塞进程
(1)是否跟system()一样?
答案:不一样。
(2)详述
前面的测试结果可见,popen调用到pclose调用之间的程序没有被阻塞,pclose后面的代码被阻塞了。所以popen不会阻塞调用者进程,但是pclose会阻塞,也就是说popen-pclose把system调用分开了,以便用户在popen后可以继续运行主进程。
2.返回值
(1)是否跟system()一样?
答案:不一样。
(2)详述
popen返回值很简单,要么非NULL,要么NULL。但是要注意,popen返回成功只代表管道创建成功,不能说明命令执行成功,命令执行结果需要通过pclose返回值来判断。
pclose返回值就跟system除开-1,1后一样。也不简单。
linux系统中对一个64位或者32的整型数据写操作是原子的吗
在Linux系统中,对于64位或32位整型数据的写操作是原子的。这意味着在一个线程写入整型数据时,另一个线程不会读到写入的部分数据。
具体来说,当一个线程写入一个整型数据时,操作系统会将该操作分解为多个CPU指令,每个指令都是原子的。这些指令会被CPU依次执行,直到整个操作完成。在这个过程中,其他线程无法读取到中间状态的数据。
因此,如果一个线程正在写入一个整型数据,另一个线程在此期间读取该数据,它只能读取到原始值或者已经完成写入的新值,而不会读取到中间状态的数据。
但需要注意的是,对于多个线程同时写入同一个整型数据的情况,需要使用同步机制(如互斥锁、读写锁等)来保证数据的一致性和正确性。
setsockopt()和getsockopt()函数
https://blog.csdn.net/weixin_44498318/article/details/120007410
https://zhuanlan.zhihu.com/p/77023584
如果setsockopt()函数返回-1则表示出错,返回0表示成功。可以使用perror()函数或者strerror()来打印出错信息。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
int main(int argc, char *argv[]) {
int sockfd;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
perror("socket");
printf("socket fail, ERROR:%s", strerror(errno));
exit(EXIT_FAILURE);
}
int optval = 1;
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR,
&optval, sizeof(optval)) == -1) {
perror("setsockopt");
printf("setsockopt fail, ERROR:%s", strerror(errno));
exit